其实前面四周学完了之后,后面的内容相对来说会轻松些,都是一些公式的实现和在前面内容上的修修补补。
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
这两个作业总体来说,不算特别难,但是还是有很多需要理解的地方。其实多练,总会越来越好的!