当前位置:  开发笔记 > 人工智能 > 正文

成本函数,sum(x)和ones(1,length(x))*x之间的区别是什么?

如何解决《成本函数,sum(x)和ones(1,length(x))*x之间的区别是什么?》经验,为你挑选了1个好方法。

我正在为Coursera做Andrew Ng教授的机器学习课程.我正在尝试编写成本函数.

这是我的第一个解决方案:

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

但它没有被接受,所以我尝试了总和:

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

并被接受.你能说我为什么吗?我唯一改变的是和总和但结果仍然相同.



1> rayryeng - R..:

这个答案没有错......至少最初没有.但是,您已经将ones矢量硬编码为具有97个元素.您需要做的是确保ones向量与训练示例一样长.X如果97个元素没有97个元素,那么它们将不适用于您的数据集,因此如果您尝试在不同的形状上运行此元素X,则会出现不兼容的尺寸错误.

因此,使用元素总数m,然后使用它来替换数字97:

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

为了确保你得到正确的答案,让我们创建一个随机的X,ytheta有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

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有