这个是coursera里的machine learning课程的作业,在用matlab实现的过程中我总结了一些经验
1. 梯度下降也分成两个部分,一个是cost function的实现,一个是
θ
的实现
2. 这里要尽量采用向量的计算方法,注意向量的计算方法不是矩阵的计算方法,总结一下向量的计算技巧,什么情况下可以一气计算,什么情况下不行,只能循环计算。微批量处理
matlab的优势就在于他可以像数学计算那样,把批量的数据作为单位一气进行运算,而不是像传统的程序一样只能一个数字一个数字的算,最典型的就是向量和矩阵,在matlab里面是可以以矩阵为单位或者以向量为单位进行计算的。如果你是以向量作为单位来计算的,那么在同一个数学等式里面,你要保证参与运算的数据都是纬度一样的向量。这里多说一句,在《线性代数》同济第五版里面,并没有专门介绍向量的运算法则,只说道一个向量的内积。我觉得可以这样理解,因为向量可以看成一个特殊的矩阵(n行1列的矩阵),那么向量的运算很多都是和矩阵以一样的,其实所谓的内积也是矩阵乘法的一种特殊形式。
3.
θj:=θj−α1m∑mi=1(hθ(x(i))−y(i))xj(i)
这个式子能不能用向量的方式来进行求解,因为这个式子比较复杂,凭空想难度还是比较高的,因此我们用一个小点数将其具体化来观察它的特点(其实Ng就是利用这种方法来讲课的,一个变量的线性回归)。
我们假设m=3,n=2,那么hypothesis的形式为
hθ(x)=θ0+θ1x1+θ2x2
。我们要确定的参数为
θ=⎛⎝⎜θ0θ1θ2⎞⎠⎟
。而系数矩阵
X
为
我们先令j=0,看一下
θ
的迭代式子有什么特点。
θ0:=θ0−α13∑3i=1(hθ(x(i))−y(i))xj(i)
。我们把这个求和公式展开,于是
θ0:=θ0−α13[(hθ(x(1))−y(1))x0(1)+(hθ(x(2))−y(2))x0(2)+(hθ(x(3))−y(3))x0(3)]
,你可以看到方框号里的这一部分,正好就是向量
θTx−Y
与向量
⎛⎝⎜x0(1)x0(2)x0(3)⎞⎠⎟
的内积。而这个向量
⎛⎝⎜x0(1)x0(2)x0(3)⎞⎠⎟
正好就是系数矩阵
X
的第一列,我们可以在matlab里用X(:,1)来表示X矩阵的第一列,对于
predictions = X * theta ;
Err = predictions - y ;
theta0 = theta(1) - alpha / m * dot(Err , X(:,1));
theta1 = theta(2) - alpha / m * dot(Err , X(:,2));
theta = [theta0 ; theta1];
这个仍然是一个一个的计算向量
θ
的分量,那我能不能一个式子就将
θ
这个向量算出呢?我们还是用简单具体的例子来观察其中的规律:
θ0=θ0−α13[Err,X(:,1)]
θ1=θ1−α13[Err,X(:,2)]
θ2=θ2−α13[Err,X(:,3)]
把这三个式子合成一个就是
⎛⎝⎜θ0θ1θ2⎞⎠⎟=⎛⎝⎜θ0θ1θ2⎞⎠⎟−α13⎡⎣⎢Err⋅X(:,1)Err⋅X(:,2)Err⋅X(:,3)⎤⎦⎥
,如果方括号括住的部分能够用合适的方式(比如说以向量运算或者矩阵运算的方式)一次性的表现出来,那么这个问题就解决了。我们仔细观察一下这一部分,把这个地方细化一下,我令
Err=⎛⎝⎜e0e1e2⎞⎠⎟
,在
⎡⎣⎢Err⋅X(:,1)Err⋅X(:,2)Err⋅X(:,3)⎤⎦⎥
中的每一个分量都是
Err
这个向量和系数矩阵
X=⎛⎝⎜111x1(1)x1(2)x1(3)x2(1)x2(2)x2(3)⎞⎠⎟
中的一列的进行内积的结果,可以观察出来,
⎡⎣⎢Err⋅X(:,1)Err⋅X(:,2)Err⋅X(:,3)⎤⎦⎥
其实就是矩阵
XT
与向量
Err
的积(这个矩阵乘法),即
XT⋅Err
,于是将
θ
向量一次性求出来的式子为
于是这个用matlab代码表示为:
predictions = X * theta ;
Err = predictions - y ;
theta = theta - alpha / m * (X' * Err);