2016-03-03 1799 views

回答

1

这是正确的,但你要实现的是矢量,而不是使用循环。您可以利用线性代数为您计算总和。您可以通过首先创建矩阵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?

2

如何:

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 
+0

的'ones'是没有必要的。 'theta(1)'是一个标量,所以当它被添加到矩阵时它将被广播。 – rayryeng

+1

是的,这是我的老习惯,虽然:) – NKN

+1

公平的:)。 – rayryeng