2017-01-10 108 views

回答

5

答案沒有錯,至少不是最初的答案。但是,您已將ones矢量硬編碼爲具有97個元素。你需要做的是確保ones矢量與訓練樣例一樣長。如果97個元素不包含97個元素,並且因此如果您嘗試在不同形狀的X上運行此元素,則97個元素不適用於您的數據集X,否則您將收到不兼容的維度錯誤。

因此,使用元素m的總數,然後用它來取代數97:

J= (1/(2*m)) * (ones(1, m) * (((X*theta)-y).^2)); 

只是要確保你得到正確的答案,讓我們創建一個隨機Xytheta有100個訓練例子和一個雙參數向量。我們將使用兩個表達式的成本,並表明他們產生相同的成本:

>> rng(123); 
>> X = rand(100, 2); 
>> y = rand(100, 1); 
>> theta = rand(2, 1); 
>> m = size(X, 1); 
>> J = 1/(2 * m) * sum(((X * theta) - y).^2); 
>> J2 = (1/(2*m)) * (ones(1, m) * (((X*theta)-y).^2)); 
>> format long g; 
>> J 

J = 

     0.0702559647930643 

>> J2 

J2 = 

     0.0702559647930643 

一句忠告

已經確定由矢量相乘,找到一個向量的和可以做到的用適當填充的向量充滿ones。我認爲這樣效率較低,您可以使用以下事實:在此特定成本函數中,您可以找到由X*theta - y生成的向量與其自身之間的點積。點積可方便地通過v.' * v來計算,其中v是列向量。這只是一個矩陣乘法,乘法運算符的左側是行向量,乘法運算符的右側是列向量。我會讓你自己驗證一下,但是如果你弄清楚了什麼是等效的操作,這就是點積。

由於上述公式,將矢量與其自身的點積乘以X*theta - y中每個元素的平方值。因此,這樣做,而不是:

d = X*theta - y; 
J = (1/(2*m)) * (d.' * d); 

你也可以看到你得到相同的結果:

>> d = X*theta - y; 
>> J = (1/(2*m)) * (d.' * d) 

J = 

     0.0702559647930643 
相關問題