J = 0;
sumTerm = 0;
for i=1:m
sumTerm = sumTerm + ((theta(1)+theta(2)*X(i))-y(i)).^2;
end
J = (1/2*m)*sumTerm;
这是否是求和的正确方法?在MATLAB中使用for循环的求和
J = 0;
sumTerm = 0;
for i=1:m
sumTerm = sumTerm + ((theta(1)+theta(2)*X(i))-y(i)).^2;
end
J = (1/2*m)*sumTerm;
这是否是求和的正确方法?在MATLAB中使用for循环的求和
这是正确的,但你要实现的是矢量,而不是使用循环。您可以利用线性代数为您计算总和。您可以通过首先创建矩阵X
,这是矩阵的点,其中第一列附加全部1,下一列包含您的单个特征/数据点,可以为每个术语计算theta(1) + theta(2)*X(i) - y(i)
。最后,通过X*theta - y
计算预测线的输出和每个数据点的真实输出之间的差值,从而可以为每个数据点生成一个差异向量。这也假设你的点阵列和theta
都是列向量,并且我相信这是正确的结构,因为这看起来像是在实施Andrew Ng的机器学习课程的单变量线性回归的成本函数。
然后可以计算这个向量与自身的点积来计算的平方差的总和,那么你可以通过2*m
划分时,即可大功告成:
vec = [ones(m,1) X]*theta - y;
J = (vec.'*vec)/(2*m); %'
你之所以要追求线性代数解决方案是因为MATLAB中的本地矩阵和矢量运算速度非常快,并且如果您可以找到线性代数的计算问题的解决方案,那么您将可以以最快的速度获得代码来计算事物。
例如,看到为什么与其它平台的标杆当MATLAB矩阵乘法是众多最快的这篇文章:Why is MATLAB so fast in matrix multiplication?
如何:
J = 0.5 * sum(((theta(1)*ones(size(X))+theta(2)*X)-y).^2)/m
或者作为@rayryeng指出的那样,你甚至可以放下ones
J = 0.5 * sum(((theta(1)+theta(2)*X)-y).^2)/m
的'ones'是没有必要的。 'theta(1)'是一个标量,所以当它被添加到矩阵时它将被广播。 – rayryeng
是的,这是我的老习惯,虽然:) – NKN
公平的:)。 – rayryeng