问题描述
我目前正在上学吴安德(Andrew Ng)的机器学习课程,我尝试在学习时实施这些东西,以免忘记它们,我刚刚完成了正则化(第7章)。我知道theta 0是正常更新的,与其他参数分开,但是,我不确定其中哪个是正确的实现。
实现1:在我的梯度函数中,在计算了正则化向量之后,将theta 0的部分更改为0,这样当将其添加到总数中时,就好像从未对theta 0进行正则化。
实现2:将theta存储在一个temp变量中:_theta,用reg_step 0更新(因此就好像没有正则化),将新的theta 0存储在一个temp变量中:t1,然后更新原始theta值用我想要的reg_step并将theta 0替换为t1(来自非常规更新的值)。
下面是我第一个实现的代码,它并不意味着要先进,我只是在练习: 我使用的八度是1索引,所以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_0的正则化。
% Calculate regularization
regularization = (reg_step / m) * theta;
% Gradient Step
gradients = (1 / m) * (X' * (predictions - y)) + regularization;
% Ignore regularization in theta_0
gradients(1) = (1 / m) * (X(:,1)' * (predictions - y));