之前就有私下写过这个编程作业,先说答案
第二周三个必须提交的作业
第一个练习,为了熟悉提交系统,答案略
第二个 计算损失函数
function J = computeCost(X, y, theta)
% Initialize some useful values
m = length(y); % number of training examples
% You need to return the following variables correctly
J = 0;
J=1/2*1/m*sum((X*theta-y).^2) %此行为编程需要输入的
end
答案和预期一致,成功提交
第三个 用梯度下降计算最佳的theta值
问题来了!!!
虽然视频一直强调要同时更新theta,但写程序的时候没注意。
J=computeCost(X,y,theta)
theta(1)=theta(1)-alpha* 1/m*(sum(X*theta-y))
theta(2)= theta(2)-alpha* 1/m*sum(X(:,2)'*(X*theta-y))
跑出来是这样。
看起来很对!但是!!提交就会提示答案不正确
因为是之前写过,跑出来一直没什么问题,所以很头秃,去参考了一下别人的,发现也没问题,最后没办法又重新看的讲义。
问题出错原因:要同时更新theta!!!
theta(2)中会运用更新后的theta(1),所以提交会一直出错
提交正确的答案如下
theta_s = theta; % 同时更新 保持原theta
J=computeCost(X,y,theta)
theta(1)=theta(1)-alpha* 1/m*(sum(X*theta_s-y))
theta(2)= theta(2)-alpha* 1/m*sum(X(:,2)'*(X*theta_s-y))
注:记录一下,因为我搜索的时候,看到大部分都没有同时更新所有theta,但是因为即使不同时,跑出来结果也差不多。。所以大概有很多人代码是待改善的