簡體   English   中英

在MATLAB中使用for循環求和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM