【Machine Learning 作业】第六周ex5&第七周ex6

其实前面四周学完了之后,后面的内容相对来说会轻松些,都是一些公式的实现和在前面内容上的修修补补。

ex5

这一个作业我已经做完了一个多月了,具体的内容都忘记了,但是也把我的代码贴上来吧。

linearRegCostFunction.m

这里就是代价函数的计算,难度不大。

h=X*theta;
J=1/(2*m).*sum((h-y).^2)+lambda/(2*m)*sum(theta(2:end,:).^2);
grad_0=1/m*sum((h-y).*X(:,1));
grad=1/m*X(:,2:end)'*(h-y)+lambda/m*theta(2:end,:);
grad=[grad_0;grad];

learningCurve.m

该部分就是写一个for循环,绘制学习曲线。

for i = 1:m
  X_t=X(1:i,:)
  y_t=y(1:i);
  [theta] = trainLinearReg(X_t, y_t, lambda);
  h=X_t*theta;
  error_train(i)=1/(2*i).*sum((h-y_t).^2);
  h=Xval*theta;
  error_val(i)=1/(2*m).*sum((h-yval).^2);
end

polyFeatures.m

在这里只用了一行解决掉了。为了不用for循环,我找到了找到了这样一个办法:函数bsxfun。其作用是对两个矩阵A和B之间的每一个元素进行指定的计算(函数fun指定);并且具有自动扩维的作用。因此这么一行可以替代一个for循环,非常方便。关于该函数具体的用法,可以参考这篇博文,其中也详细说明了repmat和bsxfun的区别。

X_poly=bsxfun(@power,repmat(X,1,p),[1:p]);

validationCurve.m

在最后一行时,我有加一个注释——“%这里告诉我,可以将linearRegCostFunction.m的公式改成点乘,这样可以直接调用函数。”。算是事后诸葛亮吧,可是后来也没去改。不过问题不大,计算的复杂对是一样的,只不过多打了一行重复代码。

theta=[]
for i=1:length(lambda_vec)
  [theta_i] = trainLinearReg(X, y, lambda_vec(i));
  theta=[theta theta_i];
end
  h=X*theta;
  m=size(X,1)
  error_train=1/(2*m).*sum((h-y).^2)%+lambda_vec'./(2*i).*sum(theta(2:end,:).^2);
  h=Xval*theta;
  m=size(Xval,1);
  error_val=1/(2*m).*sum((h-yval).^2)%+lambda_vec'./(2*m).*sum(theta(2:end,:).^2);

ex6

该部分是支持向量机。前半部分是对SVM(主要是核函数)进行练习,后面是一个垃圾邮件的应用。

gaussianKernel.m

一行代码,25分到手!(OMG,码它,码它!)
说实话,这里确实没什么难度,就是公式的实现。

sim=exp(-sum((x1-x2).^2)/(2*sigma^2))

dataset3Params.m

在这个小作业中,我不得不感慨,同样是25分,差距咋就这么大內?该部分代码如下:

Cset=[ 0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30];
sigmaset=[0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30];
pred=zeros(size(Cset,2),size(sigmaset,2));
for i=1:size(Cset,2);
  for j=1:size(sigmaset,2);
    C=Cset(i);sigma=sigmaset(j);
    model= svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma)); 
    predictions = svmPredict(model, Xval);
    pred_error=mean(double(predictions ~= yval));
    pred(i,j)=pred_error;
  end
end
[r,c]=find(pred==min(pred(:)));
r=r(1);c=c(1);
C=Cset(r);sigma=sigmaset(c);

咱也不知道为什么上一个作业的25分用一行代码就搞定了,这个作业怎么这么复杂。。。总之,我在这份作业上翻了车,绕了路。(老吴的说明文档里好像也没说明白。。)
当时一心想可不可以不用for循环呀,但终究还是败给了现实。所以各位朋友们有其他的好方法可以推荐给我哦。

processEmail.m

超简单的for循环就搞定了。

    for i=1:1899
      if strcmp(str,vocabList{i})==1
        word_indices = [word_indices ; i];
        break
      end
    end

emailFeatures.m

超简单的for循环+1

for i=word_indices
  x(i)=1;
end

这两个作业总体来说,不算特别难,但是还是有很多需要理解的地方。其实多练,总会越来越好的!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值