使用“sum”

时间:2016-03-11 16:38:53

标签: machine-learning octave gradient-descent

我正在做Andrew Ng关于机器学习的课程,我正试图围绕多个变量的渐变下降的矢量化实现,这是课程中的一个可选练习。

这是有问题的算法(取自here):

enter image description here

我不能使用sum在八度音阶中做到这一点,但我不确定如何将x(i)-y(i)的假设之和乘以所有变量xj(i)。我尝试了以下代码的不同迭代,但无济于事(维度不正确或答案错误):

theta = theta - alpha/m * sum(X * theta - y) * X;

然而,正确答案是完全不明显的(无论如何,对于像我这样的线性代数初学者,来自here):

theta = theta - (alpha/m *  (X * theta-y)' * X)';

对于涉及sum如何控制上述变换的案例,是否有经验法则?

如果是这样,是否存在上述相反版本(即从基于sum的解决方案转变为一般乘法解决方案),因为我能够使用sum提出正确的实现对于单个变量的梯度下降(尽管不是非常优雅):

temp0 = theta(1) - (alpha/m * sum(X * theta - y));
temp1 = theta(2) - (alpha/m * sum((X * theta - y)' * X(:, 2)));

theta(1) = temp0;
theta(2) = temp1;

请注意,这只涉及矢量化实现,虽然有关SO如何完成的问题,但我的问题主要是关注使用sum在Octave中实现算法。

4 个答案:

答案 0 :(得分:4)

如果你遇到

形式的东西,一般的“拇指规则”如下
SUM_i f(x_i, y_i, ...) g(a_i, b_i, ...)

然后你可以通过

轻松地对它进行矢量化(这就是上面所做的)
f(x, y, ...)' * g(a, b, ...)

因为这只是一个典型的点积,在数学中(在有限维的欧氏空间中)看起来像

<A, B> = SUM_i A_i B_i = A'B

从而

(X * theta-y)' * X)

只是

<X * theta-y), X> = <H_theta(X) - y, X> = SUM_i (H_theta(X_i) - y_i) X_i

你可以看到这两种方式都有效,因为这只是点积的数学定义。

答案 1 :(得分:1)

特别提到你问题的这一部分 - &#34;我不确定如何将x(i) - y(i)的假设之和乘以所有变量xj(i)。 &#34;

在Octave中,你可以使用&#34;。&#34;将xj(i)乘以所有预测,因此它可以写成:

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

答案 2 :(得分:0)

向量乘法自动包括计算乘积之和。因此,您不必指定sum()函数。通过使用sum()函数,您正在将向量转换为标量,这很不好。

答案 3 :(得分:0)

您实际上不想在这里使用求和,因为您尝试计算的是所有 theta 的单个值,而不是总成本 J。当您在一行代码中执行此操作时,如果您将其求和你最终得到一个单一的值(所有 theta 的总和)。 当您在上一个练习中一一计算 theta 的值时,求和是正确的,尽管是不必要的。这也是一样的:

temp0 = theta(1) - (alpha/m * (X * theta - y)' * X(:, 1));
temp1 = theta(2) - (alpha/m * (X * theta - y)' * X(:, 2));

theta(1) = temp0;
theta(2) = temp1;