[英]Summation using for loop in MATLAB
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;
這是進行求和的正確方法嗎?
這個怎么樣:
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
沒錯,但是您要實現向量化而不是使用循環。 您可以通過使用線性代數為您計算總和來利用此優勢。 您可以通過首先創建矩陣X
來計算每個項的theta(1) + theta(2)*X(i) - y(i)
,該矩陣X
是由點矩陣組成的矩陣 ,在該矩陣中,第一列與所有列都附加在第一列之后包含您的單個特征/數據點。 最后,您將通過X*theta - y
每個數據點的預測線輸出與真實輸出之間的差異,從而為每個數據點生成一個差異矢量。 這也假設您的點和theta
數組都是列向量,並且我相信這是正確的結構,因為這似乎是您在執行Andrew Ng的機器學習課程中的單變量線性回歸的成本函數。
然后,您可以計算此向量與自身的點積,以計算平方差之和,然后完成后可以除以2*m
:
vec = [ones(m,1) X]*theta - y;
J = (vec.'*vec) / (2*m); %'
之所以選擇線性代數解決方案,是因為MATLAB中的本機矩陣和矢量運算非常非常快,而且如果您能找到線性代數的計算問題的解決方案,那將是有史以來最快的解決方案您的代碼來計算事物。
例如,請參閱這篇文章,了解在使用其他平台進行基准測試時, 為什么MATLAB中的矩陣乘法是最快的: 為什么MATLAB的矩陣乘法如此之快?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.