【Machine Learning 作业】第四周ex3&第五周ex4

ex3

lrCostFunction.m
h=sigmoid(X*theta);
J=1/m*sum(-y.*log(h)-(1-y).*log(1-h));
J=J+lambda/(2*m)*sum(theta(2:size(theta)).^2);
grad(1)=1/m*X(:,1)'*(h(:,1)-y);
temp=1/m*X'*(h-y)+lambda/m*theta;
grad(2:size(grad))=temp(2:size(temp));
oneVsAll.m
initial_theta=zeros(n+1,1);
for i=1:num_labels
  options = optimset('GradObj', 'on', 'MaxIter', 50);
  [all_theta(i,:)] = ...
     fmincg (@(t)(lrCostFunction(t, X, (y ==i), lambda)), ...
           initial_theta, options);
endfor
%endfor 只能在octave中使用
predictOneVsAll.m
[x, p] = max(sigmoid(X * all_theta'), [], 2);% the 'p' of this line means the row of the max value 
predict.m
X=[ones(m,1) X];
a1=sigmoid(X*Theta1');
a1=[ones(m,1) a1];
[x,p]=max(sigmoid(a1*Theta2'),[],2);

总体来说ex3就是在前面的基础上进行修改,不算特别难。在使用矩阵计算时,首先要保证行列一致性。

ex4

ex4还是很费时间的,整整花了我6+2个小时去做完。敲代码倒不是很难,关键是修改错误!!!
要考虑到bias unit不要带到正则化中!虽然问你你知道,但是代码中总是会忘记。
另外要注意点乘和叉乘!问你你知道,写代码就死翘翘!
此外,还有若干小错误,写代码的习惯不好,需要慢慢改善。

nncostFunction.m
a_1=[ones(size(X,1),1) X];
z_2=a_1*Theta1';a_2=sigmoid(z_2);

a_2=[ones(size(a_2,1),1) a_2];
z_3=a_2*Theta2';a_3=sigmoid(z_3);
h=a_3;

y=eye(num_labels)(:,y);%copy the column n times,where n is the times of one number.
temp=-y.*log(h')-(1-y).*log(1-h');
J=(1/m)*sum(temp(:));
Theta1_sq=Theta1.^2;Theta2_sq=Theta2.^2;
reg=1/(2*m)*lambda*(sum((sum(Theta1_sq(:,2:size(Theta1,2)))))+sum((sum(Theta2_sq(:,2:size(Theta2,2))))));
J=J+reg;

delta_3=a_3-y';
delta_2=delta_3*Theta2(:,2:end).*sigmoidGradient(z_2);
Delta_1=a_1'*delta_2;
Delta_2=a_2'*delta_3;
Theta1(:,1)=0;
Theta2(:,1)=0;
Theta2_grad=1/m*Delta_2+lambda/m*Theta2';Theta2_grad=Theta2_grad';
Theta1_grad=1/m*Delta_1+lambda/m*Theta1';Theta1_grad=Theta1_grad';

ex4的整个精华就在这个练习中了。写这个代码让我又去重看了BP的视频,把思路再理了一遍。
代码写出来了,但是改错真的上头。
① 最开始计算J的时候,没有考虑把J进行增广,所以计算出来的值高达300多,网络上的一些博文也有这个问题。看到一个博主用了 y=eye(num_labels)(:,y);
解决了这个问题。很是精妙。
②计算delta时要分步,从后往前一步一步计算。另外正则化千万不要带入bias unit!

sigmoidGradient.m
g=sigmoid(z).*(1-sigmoid(z));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值