答案没有错,至少不是最初的答案。但是,您已将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