写完ex5的作业之后蓦然回首发现我原来完成作业的进度还是挺慢的,人家吴教授写的建议是3h完成的作业,我可能用上两天:我就是纠结那几行英文的理解,纠结几个小细节,充分吃透,才能往下一步走。
这一期的练习,就是有两个地方需要着重说明一下:
1.learningCurve:学习曲线。Learning Curve是计算随着样本数量m的变化,训练集和验证集的误差,所以每一个单元的训练集误差(error_train(i)),应该以i为m计算出先训练出theta值,然后再计算error_train值,而error_validation应当以你在训练集有限的m训练出来的theta,在我所有训练集验证产生的error。
它的总体思想就是:若干不同数量的训练集得出的theta,在validation集的误差到底有多大。
for i = 1:m
Xi = X(1:i, :);
yi = y(1:i);
[theta] = trainLinearReg(Xi, yi, lambda);
error_train(i) = linearRegCostFunction(Xi, yi, theta, 0);
error_val(i) = linearRegCostFunction(Xval, yval, theta, 0);//原先这里用的Xval是跟上面的Xi一样截取同样数量的长度的,其实是不用截取的。
endfor
2.lambda = 0
在最后一项练习validationCurve中要计算随着不同的lambda,训练集和验证集的误差到底有多大。计算步骤有三:1.先按照给定的X, y,lambda训练出theta,2拿这个theta值计算验证集的代价。注意哦,第一步计算出theta的时候lambda要放指定的值,但是计算第二步代价函数的时候lambda要设为0.为什么呢?依我理解,lambda值拿来训练处theta的,lambda越高,惩罚越大,计算出来的theta是不同的,对不?但之后,theta已经计算出来了,如果再套上lambda计算代价,就会显得重复多余。lambda的职责主要是用来训练,而不是计算误差。(其实在ex5的最前面已经提醒过了哦)
% ====================== YOUR CODE HERE ======================
for i = 1:length(lambda_vec)
lambda = lambda_vec(i);
[theta] = trainLinearReg(X, y, lambda);
error_train(i) = linearRegCostFunction(X, y, theta, 0);//原来这里放的是lambda,结果跟答案出入太大,后来改为0
error_val(i) = linearRegCostFunction(Xval, yval, theta, 0);
end
% =========================================================================
end