我是Matlab和机器学习的新手,我试图计算梯度下降的成本函数。
函数computeCost有3个参数:
我已经有了使用矩阵乘法的解决方案
function J = computeCost(X, y, theta)
m = length(Y);
h = X * theta;
sError = (h - y) .^ 2;
J = sum(sError) / (2 * m);
end
但是现在,我试图在没有矩阵乘法的情况下做同样的事情
function J = computeCost(X, y, theta)
m = length(Y);
S = 0;
for i = 1:m
h = X(i, 1) + theta(2) * X(i, 2);
S = S + ((h - y(i)) ^ 2);
end
J = (1/2*m) * S;
end
但是我没有得到相同的结果,并且首先是肯定的(我之前已经使用过它)。
答案 0 :(得分:2)
你有两个轻微(但基本)的错误 - 它们是非常简单的错误,但肯定可以忽略。
您忘记在您的假设中包含偏见词:
h = X(i,1)*theta(1) + X(i,2)*theta(2);
%// ^^^^^^
请记住,线性回归的假设等于theta^{T}*x
。您没有包含所有theta
字词 - 仅包含第二个字词。
(2*m)
标准化的最后一句话略有偏差。您目前拥有它:
J = (1/2*m) * S;
因为乘法和除法具有相同的操作规则,所以这与(1/2)*m
相同,而这不是你想要的。只需确保(2*m)
包含自己的括号,以确保将其评估为S / (2*m)
:
J = (1/(2*m)) * S;
这将确保首先评估2*m
,然后通过乘以误差平方和得到它的倒数。
当您解决这些问题时,您将获得与使用矩阵公式相同的结果。
BTW,你的代码中有轻微错误。它应该是m = length(y)
,而不是m = length(Y)
。