这几天一直在看Angdrew Ng 的机器学习视频, 里面关于梯度下降(Gradient descent)算法的矢量化(vectorization)过程听得云里雾里的,好在经过后面的编程作业,总算是大致弄清楚了矢量化的过程。
Gradient descent:
θj:=θj−α1m∑i=1m(hθ(x(i))−y(i))x(i)j
θ0:=θ0−α1m∑i=1m(hθ(x(i))−y(i))x(i)0
θ1:=θ1−α1m∑i=1m(hθ(x(i))−y(i))x(i)1
θ2:=θ2−α1m∑i=1m(hθ(x(i))−y(i))x(i)2
视频里面说,把θ1,θ2,θ3看成是一个3x1的向量θ,即θ=(θ1,θ2,θ3)T。同时我们也知道α,m,∑i=1m(hθ(x(i))−y(i))都是实数(real number),不好理解的地方就在于
x(i)j它是一个向量,那么在矢量化的时候怎么处理呢?我们先来看例子,手动迭代(iteration)一个。
例题1:
Data setting:
Parameter: θ=(θ1,θ2)T=(a,b)
hypothesis: hθ=θ0+θ1∗x
design matrix: X=
111231
此处暂时或略α,m,因为它们都是实数
因此
θ0:=θ0−α1m∑i=1m(hθ(x(i))−y(i))x(i)0=(a+2∗b−5)∗1−−−−−−−−−−−−−−+(a+3∗b−7)∗1−−−−−−−−−−−−−−+(a+1∗b−6)∗1−−−−−−−−−−−−−−
θ1:=θ1−α1m∑i=1m(hθ(x(i))−y(i))x(i)1=(a+2∗b−5)∗2−−−−−−−−−−−−−−+(a+3∗b−7)∗3−−−−−−−−−−−−−−+(a+1∗b−6)∗1−−−−−−−−−−−−−−
这样就能通过一次手动计算得到θ1,θ2
下面进行矢量化:
显然,上面算式中的红色部分可以看成是X*θ(设为矩阵A)的结果,而黑色下划线的部分则是(A−y).∗xj,其中xj表示第j列特征值,比如对于θ1来说,xj=(2,3,1)T。然后再把下划线的部分加起来即可。所以例一矢量化后在Matlab/Octave中的公式为:
θ=θ−α1m[sum((X∗θ−y).∗X(:,2));sum((X∗θ−y).∗X(:,1))]
注:其中X(:,i) 表示矩阵X中的第j列特征值,也就是前面提到的xj
例题2:
这个例题是Andrew Ng 的机器学习视频中,第二周课后练习的part 3部分,下面是答案和结果。
prediction = X*theta - y;
for i = 1:size(X,2);
temp_matrix(i) = sum(prediction .* X(:,i));
end
theta = theta - alpha * (1/m) * temp_matrix;