成本函数,sum(x) 和 ones(1,length(x)) *x 有什么区别?

Cost Function, what's the difference between sum(x) and ones(1,length(x)) *x?

我正在 Coursera 上 Andrew Ng 教授的机器学习课程。我正在尝试对成本函数进行编码。

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

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

但是没有被接受,所以我用sum试了一下:

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

并被接受。你能告诉我为什么吗?我唯一改变的是 ones 和 sum 但结果还是一样。

这个答案没有错……至少一开始没有。但是,您已将 ones 向量硬编码为具有 97 个元素。你需要做的是确保 ones 向量与训练示例一样长。如果你的数据集 X 没有 97 个元素,那么 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