我目前正在学习吴恩达的机器学习课程,并且在学习过程中尝试实现这些内容以防忘记,我刚完成正则化(第七章)。我知道theta 0是正常更新的,与其他参数分开更新,但我并不确定这两种实现中哪一种是正确的实现。
实现1:在我的梯度函数中,计算完正则化向量后,将theta 0部分改为0,这样当它被加到总和中时,就好像theta 0从未被正则化过一样。
实现2:将theta存储在一个临时变量中:_theta,用0的正则化步长更新它(因此就好像没有正则化),将新的theta 0存储在一个临时变量中:t1,然后用我想要的正则化步长更新原始的theta值,并用t1(来自非正则化更新的值)替换theta 0。
下面是我的第一种实现的代码,这并不是为了高级用途,我只是在练习:我在使用Octave,它是1-index的,所以theta(1)是theta(0)
function ret = gradient(X,Y,theta,reg_step), H = theta' * X; dif = H-Y; mul = dif .* X; total = sum(mul,2); m=(size(Y)(1,1)); regular = (reg_step/m)*theta; regular(1)=0; ret = (total/m)+regular,endfunction
提前感谢。
回答:
对第一种实现进行了一点小的调整对我来说是有效的。
首先,计算每个theta的正则化。然后继续执行梯度步骤,之后你可以手动更改包含梯度的矩阵的第一项,以忽略theta_0的正则化。
% 计算正则化regularization = (reg_step / m) * theta;% 梯度步骤gradients = (1 / m) * (X' * (predictions - y)) + regularization;% 忽略theta_0的正则化gradients(1) = (1 / m) * (X(:, 1)' * (predictions - y));