吴恩达机器学习 第二周
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)}_n\end{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)})^T\end{bmatrix} X=⎣
⎡(x(1))T(x(2))T(x(3))T⋮(x(m))T⎦
⎤,X是 m × ( n + 1 ) m\times(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 n\geq 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&6\end{bmatrix} A=⎣
⎡135246⎦
⎤
操作 | 解释 | 结果 |
---|---|---|
A(3,2) | 索引到A矩阵的第三行第二列数据 | 6 |
A(2,:) | 返回第二行的所有元素 | [ 3 4 ] \begin{bmatrix}3&4\end{bmatrix} [34] |
A([1 3] ,: ) | 取 A 矩阵第一个索引值为 1 或 3 的元素, 也就是说取 A 矩阵的第一行和第三行的每一列,冒号表示的是取这两行的每一列元素 | [ 1 2 5 6 ] \begin{bmatrix}1&2\\5&6\end{bmatrix} [1526] |
A(:,2)= [ 10 ; 11 ; 12 ] \begin{bmatrix}10;&11;&12\end{bmatrix} [10;11;12] | 取 A 矩阵的第二列, 然后将它赋值为 10 11 12 | A = [ 1 10 3 11 5 12 ] A=\begin{bmatrix}1&10\\3&11\\5&12\end{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&102\end{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&6\end{bmatrix},B=\begin{bmatrix}11&12\\13&14\\15&16\end{bmatrix},C=\begin{bmatrix}1&1\\2&2\end{bmatrix},V=\begin{bmatrix}1\\2\\3\end{bmatrix} A=⎣
⎡135246⎦
⎤,B=⎣
⎡111315121416⎦
⎤,C=[1212],V=⎣
⎡123⎦
⎤
操作 | 解释 | 结果 |
---|---|---|
A( : ) | 将矩阵中的元素按列存储 得到一个长列向量 |
[ 1 3 5 2 4 6 ] \begin{bmatrix}1\\3\\5\\2\\4\\6\end{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&0\end{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\\2\end{bmatrix} r=⎣
⎡132⎦
⎤ c = [ 1 2 3 ] c=\begin{bmatrix}1\\2\\3\end{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&2\end{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(8\pi t) sin(8πt)和 c o s ( 8 π t ) cos(8\pi 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)}_n\end{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)}_1\cdots&x^{(1)}_n \\ x^{(2)}_0&x^{(2)}_1\cdots&x^{(2)}_n\\ x^{(3)}_0&x^{(3)}_1\cdots&x^{(3)}_n\\ \vdots &\vdots&\vdots&\\ x^{(m)}_0&x^{(m)}_1\cdots&x^{(m)}_n\end{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 ) m\times(n+1) m×(n+1)的设计矩阵。