梯度下降算法的矢量化

我正在matlab中编码梯度下降。对于两个功能,我得到了更新步骤:

temp0 = theta(1,1) - (alpha/m)*sum((X*theta-y).*X(:,1));
temp1 = theta(2,1) - (alpha/m)*sum((X*theta-y).*X(:,2));
theta(1,1) = temp0;
theta(2,1) = temp1;

但是,我希望将此代码矢量化,并能够将其应用于任意数量的功能。对于矢量化部分,它表明我试图做的是矩阵乘法

theta = theta - (alpha/m) * (X' * (X*theta-y));

这很好看,但是当我尝试时,我意识到它不适用于梯度下降,因为参数不会同时更新。

然后,如何对此代码进行矢量化并确保参数同时更新?


答案 1

对于矢量化版本,请尝试以下操作(两个步骤以显式同时更新):

 gradient = (alpha/m) * X' * (X*theta -y)
 theta = theta - gradient

答案 2

您的矢量化是正确的。我也尝试了你的两个代码,它得到了相同的θ。请记住,不要在第二个实现中使用更新的θ。

这也可以工作,但比第二个实现简化更少:

Error = X * theta - y;
for i = 1:2
    S(i) = sum(Error.*X(:,i));
end

theta = theta - alpha * (1/m) * S'