我正在为Coursera做Andrew Ng教授的机器学习课程.我正在尝试编写成本函数.
这是我的第一个解决方案:
J= (1/(2*m))* (ones(1,97) * (((X*theta)-y).^2 ));
但它没有被接受,所以我尝试了总和:
J = 1 / (2 * m) * sum(((X * theta) - y).^2);
并被接受.你能说我为什么吗?我唯一改变的是和总和但结果仍然相同.
这个答案没有错......至少最初没有.但是,您已经将ones
矢量硬编码为具有97个元素.您需要做的是确保ones
向量与训练示例一样长.X
如果97个元素没有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