2017-01-10 208 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