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;
这是进行求和的正确方法吗?
答案 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?