成本函数,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 ));
为了确保您得到正确的答案,让我们随机创建一个 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
我正在 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 ));
为了确保您得到正确的答案,让我们随机创建一个 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