答案沒有錯,至少不是最初的答案。但是,您已將ones
矢量硬編碼爲具有97個元素。你需要做的是確保ones
矢量與訓練樣例一樣長。如果97個元素不包含97個元素,並且因此如果您嘗試在不同形狀的X
上運行此元素,則97個元素不適用於您的數據集X
,否則您將收到不兼容的維度錯誤。
因此,使用元素m
的總數,然後用它來取代數97:
J= (1/(2*m)) * (ones(1, m) * (((X*theta)-y).^2));
只是要確保你得到正確的答案,讓我們創建一個隨機X
,y
和theta
有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