概述
吴恩达机器学习 第二周
- 0 总结
- 1 多变量线性回归
- 1.1 多维特征
- 1.2 多元梯度下降
- 1.3 梯度下降法实践——特征缩放
- 1.4 梯度下降法实践——学习率
- 1.5 特征和多项式回归
- 1.6 正规方程
- 1.7 正规方程及不可逆性
- 2 Octave教程
- 2.1 基本操作
- 2.2 移动数据
- 2.3 计算数据
- 2.4 绘图
- 2.5 控制语句
- 2.6 向量化
0 总结
学习时间:2022.9.5 ~ 2022.9.11
- 学习了多变量的线性回归的公式表达、梯度下降方法,以及如何进行特征缩放,如何选择学习率。
- 学习了多变量的线性回归的另一种求解参数的方法——正规方程,以及正规方程中不可逆的情况的求解方法。
- 比较了梯度下降和正规方程两种方法的优劣,学会在何种情况下使用何种方法的诀窍。
- 复习了matlab对数据的基本操作,包括:矩阵的运算、切片、绘图等等,还复习了while、for语句的语法、函数的编写方法。
- 学习如何用向量代替循环,从而使运算速度加快。
1 多变量线性回归
1.1 多维特征
变量写法及定义
n n n=特征的数量,比如这个例子中,有4个特征(四列)——房子大小( x 1 x_1 x1)、卧室数量( x 2 x_2 x2)、有几层( x 3 x_3 x3)、房子使用时间( x 4 x_4 x4)。
m m m=样本大小,比如这个例子中,有47行,47个样本
x ( i ) x^{(i)} x(i)=样本的第i个输入,如图中粉色线条所示, x ( 2 ) = [ 1416 3 2 40 ] x^{(2)}=begin{bmatrix} 1416 \ 3 \ 2 \ 40 end{bmatrix} x(2)=⎣ ⎡14163240⎦ ⎤
x j ( i ) x^{(i)}_j xj(i)=第i个输入的第j个特征, x 3 ( 2 ) x^{(2)}_3 x3(2)=2
多元线性回归表达式
1.2 多元梯度下降
从上到下依次是:
假设函数
参数:n+1维向量
代价函数
梯度下降法
左侧是之前推倒的只有一个特征的梯度下降方法。
右侧是多元线性规划的梯度下降方法,注意, x 0 x_0 x0=1,两者本质上是一样的。
1.3 梯度下降法实践——特征缩放
Q:为什么要进行特征缩放?
A:以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-
2000 平方英尺,而房间数量的值则是 0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能, 看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛(因为梯度下降走得路径很曲折)。解决的方法是尝试将所有特征的尺度都尽量缩放到-1 到 1 之间
。
归一化(mean mormalization)
x
n
(
i
)
=
x
n
(
i
)
−
u
n
s
n
x_n^{(i)}=frac{x_n^{(i)}-u_n}{s_n}
xn(i)=snxn(i)−un其中,
u
n
u_n
un是平均值,
s
n
s_n
sn是标准差,也可以用最大值-最小值代替。这样算得的x会在-0.5到0.5之间。
1.4 梯度下降法实践——学习率
Q:如何判断梯度下降已经收敛了?
A:在进行迭代的过程中画出下面的图,横坐标表示迭代次数,纵坐标表示对应的
J
(
θ
)
J(theta)
J(θ)的值。在每次迭代之后
J
(
θ
)
J(theta)
J(θ)应该不断减小。可以看到,第300次迭代和第400次迭代
J
(
θ
)
J(theta)
J(θ)的值都差不多,因此可以选择迭代300次。(另:也可以在每次迭代后判断
J
(
θ
)
J(theta)
J(θ)是否小于某个很小的数比如
1
0
−
3
10^{-3}
10−3来判断收敛。但是这个很小的数不好取值)
学习率
α
alpha
α的选择
α
alpha
α太小:收敛慢
α
alpha
α太大:
J
(
θ
)
J(theta)
J(θ)在每次迭代不一定会减小,甚至不会收敛
解决方法:尝试不同的学习率(…,0.001,0.01,0.1,1,…),通过观察
J
(
θ
)
J(theta)
J(θ)曲线判断学习率是否可行。
1.5 特征和多项式回归
1.6 正规方程
到目前为止,我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程方法
是更好的解决方案。
正规方程是通过求解下面的方程来找出使得代价函数最小的参数的:
∂
J
(
θ
j
)
∂
θ
j
=
0
frac{partial J(theta_j)}{partial theta_j}=0
∂θj∂J(θj)=0
假设有m个训练样本
(
x
(
1
)
,
y
(
1
)
)
,
.
.
.
,
(
x
(
m
)
,
y
(
m
)
)
(x^{(1)},y^{(1)}),...,(x^{(m)},y^{(m)})
(x(1),y(1)),...,(x(m),y(m));n个特征,则:
x
(
i
)
=
[
x
0
(
i
)
x
1
(
i
)
x
2
(
i
)
⋮
x
n
(
i
)
]
x^{(i)}=begin{bmatrix} x^{(i)}_0 \ x^{(i)}_1 \ x^{(i)}_2 \ vdots \ x^{(i)}_nend{bmatrix}
x(i)=⎣
⎡x0(i)x1(i)x2(i)⋮xn(i)⎦
⎤,
x
(
i
)
x^{(i)}
x(i)表示第i个输入样本,是n+1维向量。则:
X
=
[
(
x
(
1
)
)
T
(
x
(
2
)
)
T
(
x
(
3
)
)
T
⋮
(
x
(
m
)
)
T
]
X=begin{bmatrix} (x^{(1)})^T \ (x^{(2)})^T \ (x^{(3)})^T \ vdots \ (x^{(m)})^Tend{bmatrix}
X=⎣
⎡(x(1))T(x(2))T(x(3))T⋮(x(m))T⎦
⎤,X是
m
×
(
n
+
1
)
mtimes(n+1)
m×(n+1)的设计矩阵。利用正规方程解出向量
θ
=
(
X
T
X
)
−
1
X
T
y
textcolor{Red}{theta=(X^TX)^{-1}X^Ty}
θ=(XTX)−1XTy。
以下表示数据为例:
如图,每一列表示特征,每一行表示每个样本,一共4个样本,即
m=4,n=4
。
由此得到训练集特征矩阵为 X X X(包含了 x 0 = 1 x_0=1 x0=1),并且训练结果为 y y y,利用正规方程解出向量 θ = ( X T X ) − 1 X T y textcolor{Red}{theta=(X^TX)^{-1}X^Ty} θ=(XTX)−1XTy。
Q:什么时候用正规方程法,什么时候用梯度下降?
A:特征个数小于10000时可以选择使用正规方程法。
梯度下降 | 正规方程 |
---|---|
需要选择学习率 | 不需要选择学习率 |
需要多次迭代 | 一次运算得出 |
当特征数量 n 大时也能较好适用 | 如果特征数量 n 较大则运算代价大,因为矩阵逆的计算时间复杂度为 O(n3),通常来说当 n 小于 10000 时还是可以接受的 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
1.7 正规方程及不可逆性
Q:什么时候
X
X
T
XX^T
XXT会不可逆?
A:①特征多余——删除多余的特征
②特征数远大于样本数(
n
≥
m
ngeq m
n≥m)——删除部分的特征或正则化
2 Octave教程
2.1 基本操作
命令 | 代码 | 结果 |
---|---|---|
次方 | 2^ 6 | 2的6次方为64 |
赋值 | a= ‘12’ | 给a赋值为字符串‘12’ |
判断等于 | 1== 2 | 结果为0 |
不等于 | 1~= 2 | 结果为1 |
与 | 1&& 0 | 结果为0 |
或 | 1||0 | 结果为1 |
异或 | XOR (1,0) | 结果为1 |
圆周率 | pi | |
输出 | disp | disp(a)输出a的值; disp(sprintf(‘%0.2f’,a)) |
建立矩阵 | A=[1 2;3 4;5 6] | 三行两列的矩阵 |
V=1:0.1:2 | 集合V是一组值,从数值 1 开始,增量或说是步长为 0.1,直到增加到 2,按照这样的方法对向量 V 操作,可以得到一个行向量[1, 1.1, 1.2, …,1.9, 2] | |
ones (2,3)2*ones (2,3) | 生成2行3列单位阵 生成2行3列值都为2的矩阵 | |
zeros (1,3) | 生成1行3列的零矩阵 | |
rand (3,3) | 生成3行3列的矩阵,每个数都是(0,1)之间的随机数 | |
randn (1,3) | 生成1行2列的矩阵,每个数满足期望为0、方差为1的高斯分布 | |
hist (w)hist (w,50) | 绘制直方图 绘制50条的直方图 | |
eye (6) | 生成6x6的单位阵 |
2.2 移动数据
size
假设A是一个3x2的矩阵,size(A)返回的是[3 , 2];size(A,1)将返回3,即A的第一个维度;size(A,2)将返回2,即A的第二个维度。
length
假设有一个向量v=[1 2 3 4], length(v)返回4;length(A)返回3,因为A最大维度是3。
读取和储存数据
载入数据
:load(‘featureX.dat’)
删除某个变量
:clear featuresX
将变量v储存在hello.mat文件中
:save hello.mat v || save hello.txt v -ascii(将数据v以askii码形式存储在hello.txt中)
操作数据
!矩阵索引从1开始
假设
A
=
[
1
2
3
4
5
6
]
A=begin{bmatrix}1&2\3&4\5&6end{bmatrix}
A=⎣
⎡135246⎦
⎤
操作 | 解释 | 结果 |
---|---|---|
A(3,2) | 索引到A矩阵的第三行第二列数据 | 6 |
A(2,:) | 返回第二行的所有元素 | [ 3 4 ] begin{bmatrix}3&4end{bmatrix} [34] |
A([1 3] ,: ) | 取 A 矩阵第一个索引值为 1 或 3 的元素, 也就是说取 A 矩阵的第一行和第三行的每一列,冒号表示的是取这两行的每一列元素 | [ 1 2 5 6 ] begin{bmatrix}1&2\5&6end{bmatrix} [1526] |
A(:,2)= [ 10 ; 11 ; 12 ] begin{bmatrix}10;&11;&12end{bmatrix} [10;11;12] | 取 A 矩阵的第二列, 然后将它赋值为 10 11 12 | A = [ 1 10 3 11 5 12 ] A=begin{bmatrix}1&10\3&11\5&12end{bmatrix} A=⎣ ⎡135101112⎦ ⎤ |
A = [A, [100, 101, 102]] | 在原矩阵的右边附加了一个新的列矩阵 | A = [ 1 10 100 3 11 101 5 12 102 ] A=begin{bmatrix}1&10&100\3&11&101\5&12&102end{bmatrix} A=⎣ ⎡135101112100101102⎦ ⎤ |
C=[A B] | 矩阵 A 在左边, 矩阵B 在右边, 这样组成了 C 矩阵 | |
C = [A; B] | 把两个矩阵放在一起, 只不过现在是上下排列, 所以现在 A 在上面 B 在下面 |
2.3 计算数据
初始化:
A
=
[
1
2
3
4
5
6
]
,
B
=
[
11
12
13
14
15
16
]
,
C
=
[
1
1
2
2
]
,
V
=
[
1
2
3
]
A=begin{bmatrix}1&2\3&4\5&6end{bmatrix},B=begin{bmatrix}11&12\13&14\15&16end{bmatrix},C=begin{bmatrix}1&1\2&2end{bmatrix},V=begin{bmatrix}1\2\3end{bmatrix}
A=⎣
⎡135246⎦
⎤,B=⎣
⎡111315121416⎦
⎤,C=[1212],V=⎣
⎡123⎦
⎤
操作 | 解释 | 结果 |
---|---|---|
A( : ) | 将矩阵中的元素按列存储 得到一个长列向量 | [ 1 3 5 2 4 6 ] begin{bmatrix}1\3\5\2\4\6end{bmatrix} ⎣ ⎡135246⎦ ⎤ |
A .* B | 矩阵 A 中的每一个元素与矩阵 B 中的对应元素相乘 | |
A .^ 2 | 矩阵 A 中每一个元素平方 | |
1 ./ A | 得到 A 中每一个元素的倒数 (点号表示对每一个元素进行操作) | |
log(A) exp(A) abs(A) -A A+1 | 每个元素进行求对数 运算每个元素进行 指数 运算每个元素取 绝对值 每个元素取 相反数 每个元素 加一 | |
v+ones(length(v),1) | 每个元素加一 | |
A’ | 转置 | |
val=max(V) [val, ind] = max(V) | 求向量A的最大值注意V 是一个矩阵的话, 这样做就是对每一列求最大值 | val=3,ind=3 |
max(A, B) max(A,[],1) max(A,[],2) | 逐元素比较A和B的最大值,返回3x3的矩阵得到每一列的最大值 ,这里的 1 表示取 A 矩阵第一个维度的最大值得到每一行的最大值 | |
A<3 | 将进行逐元素的运算, 元素小于3的返回1,否则返回 0 | [ 1 1 0 0 0 0 ] begin{bmatrix}1&1\0&0\0&0end{bmatrix} ⎣ ⎡100100⎦ ⎤ |
find(A<3) | 寻找小于3的元素的下标 | |
[r,c] = find( A>=7 ) | 找出所有 A 矩阵中大于等于 7 的元素, 因此, r 和c 分别表示行和列 , 这就表示, 第一行第一列的元素大于等于 7, 第三行第二列的元素大于等于 7, 第二行第三列的元素大于等于 7 |
r
=
[
1
3
2
]
r=begin{bmatrix}1\3\2end{bmatrix}
r=⎣
⎡132⎦
⎤ c = [ 1 2 3 ] c=begin{bmatrix}1\2\3end{bmatrix} c=⎣ ⎡123⎦ ⎤ |
A = magic(3) | magic 函数将返回一个矩阵, 称为魔方阵或幻方 (magic squares), 它们具有以下这样的数学性质: 它们所有的行和列和对角线加起来都等于相同的值 | [ 8 1 6 3 5 7 4 9 2 ] begin{bmatrix}8&1&6\3&5&7\4&9&2end{bmatrix} ⎣ ⎡834159672⎦ ⎤ |
sum(A) prod(a) | 把 a 中所有元素加 起来product(乘积), 它将 返回所有元素的乘积 | |
floor(a) ceil(a) | 向下四舍五入 , 0.5 将被下舍入变成 0向上四舍五入 , 0.5 将上舍入变为最接近的整数, 也就是 1 | |
pinv(A) | 求A矩阵的逆矩阵 (A的逆矩阵乘以A等于单位阵) |
2.4 绘图
绘制 s i n ( 8 π t ) sin(8pi t) sin(8πt)和 c o s ( 8 π t ) cos(8pi t) cos(8πt)
t=[0:0.01:0.98]; % t=[0,0.01,0.02,...,0.98]
y1=sin(2*pi*4*t);
y2=cos(2*pi*4*t);
plot(t,y1);
hode on; % 将新的图像绘制在旧的之上
plot(t,y2);
xlabel('time');ylabel('value'); % 标记x轴和y轴
legend('sin','cos') % 图例放在右上方
title('myplot'); % 显示标题
可视化矩阵
%% 生成一个颜色图像, 一个灰度分布图, 并在右边也加入一个颜色条。
%% 所以这个颜色条显示不同深浅的颜色所对应的值
A=magic(5)
imagesc(A)
colorbar
colormap gray
2.5 控制语句
for语句
v = zeros(10,1);
for i=1:10, % i=1,i=2,...,i=10
v(i)=2^i;
end;
while语句
i=1;
while true,
v(i) = 999;
i=i+1;
if(i==6)
break; % i=6时停止循环
end; % 结束if语句
end; % 结束while语句
if-else语句
if v(1)==1,
disp('value = 1');
elseif v(1)==2,
disp('value = 2');
else
disp('value unknow');
end;
函数
定义的squarethisnumber函数保存在squarethisnumber.m中。
function y = squareThisNumber(x) % 函数需要输入一个参数x,函数返回的值保存在y中
y=x^2;
复杂一点的例子(计算损失函数):
function J = costFunction(X, y, theta)
% X 包含训练集的设计矩阵
% y 是分类标签
m = size(X,1); % 训练集的个数(也就是X的行数)
predictions = X*theta; % 预测值,m维的向量
sqrError = (predictions - y).^2
J = 1/(2*m)*sum(sqrErrors);
2.6 向量化
以之前的线性规划为例子
左侧为没有向量化的表达,因为matlab中矩阵下标从1开始,所以j是从1到n+1。
右侧为向量化的表达。
梯度下降
θ theta θ是每个特征前的参数。
假设有m个训练样本
( x ( 1 ) , y ( 1 ) ) , . . . , ( x ( m ) , y ( m ) ) (x^{(1)},y^{(1)}),...,(x^{(m)},y^{(m)}) (x(1),y(1)),...,(x(m),y(m));n个特征
,则:
x ( i ) = [ x 0 ( i ) x 1 ( i ) x 2 ( i ) ⋮ x n ( i ) ] x^{(i)}=begin{bmatrix} x^{(i)}_0 \ x^{(i)}_1 \ x^{(i)}_2 \ vdots \ x^{(i)}_nend{bmatrix} x(i)=⎣ ⎡x0(i)x1(i)x2(i)⋮xn(i)⎦ ⎤, x ( i ) x^{(i)} x(i)表示第i个输入样本,是n+1维向量
。则:
X = [ x 0 ( 1 ) x 1 ( 1 ) ⋯ x n ( 1 ) x 0 ( 2 ) x 1 ( 2 ) ⋯ x n ( 2 ) x 0 ( 3 ) x 1 ( 3 ) ⋯ x n ( 3 ) ⋮ ⋮ ⋮ x 0 ( m ) x 1 ( m ) ⋯ x n ( m ) ] X=begin{bmatrix} x^{(1)}_0&x^{(1)}_1cdots&x^{(1)}_n \ x^{(2)}_0&x^{(2)}_1cdots&x^{(2)}_n\ x^{(3)}_0&x^{(3)}_1cdots&x^{(3)}_n\ vdots &vdots&vdots&\ x^{(m)}_0&x^{(m)}_1cdots&x^{(m)}_nend{bmatrix} X=⎣ ⎡x0(1)x0(2)x0(3)⋮x0(m)x1(1)⋯x1(2)⋯x1(3)⋯⋮x1(m)⋯xn(1)xn(2)xn(3)⋮xn(m)⎦ ⎤,X是 m × ( n + 1 ) mtimes(n+1) m×(n+1)的设计矩阵。
最后
以上就是甜美月光为你收集整理的吴恩达ML WEEK2 线性回归+MATLAB0 总结1 多变量线性回归2 Octave教程的全部内容,希望文章能够帮你解决吴恩达ML WEEK2 线性回归+MATLAB0 总结1 多变量线性回归2 Octave教程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复