在MATLAB中使用for循环求和

时间:2016-03-03 21:23:15

标签: matlab for-loop

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;

这是进行求和的正确方法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是正确的,但是你想要实现矢量化而不是使用循环。您可以通过使用线性代数为您计算总和来利用这一点。您可以为每个字词计算theta(1) + theta(2)*X(i) - y(i),方法是首先创建矩阵X,这是一个矩阵点,其中第一列附加了所有1,下一列包含您的单个功能/数据点。您最终将计算预测线的输出与每个数据点的真实输出之间的差值X*theta - y,从而产生每个数据点的差异向量。这也假设你的点数组和theta都是列向量,我相信这是正确的结构,因为这看起来像你正在实现Andrew Ng&#单变量线性回归的成本函数39;机器学习课程。

然后,您可以计算此向量的点积以计算平方差的总和,然后在完成后可以除以2*m

vec = [ones(m,1) X]*theta - y;
J = (vec.'*vec) / (2*m); %'

你应该寻求线性代数解决方案的原因是因为MATLAB中的原生矩阵和向量运算非常非常快,如果你能找到线性代数计算问题的解决方案,那么它就是最快,你可以得到你的代码来计算东西。

例如,请参阅这篇文章,了解为什么在与其他平台进行基准测试时,MATLAB中的矩阵乘法是最快的:Why is MATLAB so fast in matrix multiplication?