使用 "sum" 在 Octave 中实现多个变量的梯度下降
Implementing gradient descent for multiple variables in Octave using "sum"
我正在学习 Andrew Ng 的机器学习课程,我正在努力研究多变量梯度下降的矢量化实现,这是课程中的可选练习。
这是有问题的算法(取自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
的解决方案到一般乘法解决方案),因为我能够使用 [=14 提出正确的实现=] 用于单个变量的梯度下降(尽管不是一个非常优雅的变量):
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 中实现算法有关。
大体的"rule of the thumb"如下,如果遇到这种形式的
SUM_i f(x_i, y_i, ...) g(a_i, b_i, ...)
然后你可以通过
轻松地将它矢量化(这就是上面所做的)
f(x, y, ...)' * g(a, b, ...)
因为这只是一个典型的点积,在数学中(在有限维的欧几里得space中)看起来像
<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
如您所见,这是双向的,因为这只是点积的数学定义。
具体提到你问题的这一部分 - "I'm not sure how to multiply the sum of the hypothesis of x(i) - y(i) by the all variables xj(i)."
在 Octave 中,您可以将 xj(i) 乘以所有使用“.”的预测,因此它可以写成:
m = size(X, 1);
predictions = X * theta;
sqrErrors = (predictions-y).^2;
J = 1 / (2*m) * sum(sqrErrors);
向量乘法自动包括计算乘积之和。所以你不必指定 sum() 函数。通过使用 sum() 函数,您将向量转换为标量,这很糟糕。
您实际上不想在这里使用求和,因为您尝试计算的是所有 theta 的单个值,而不是总成本 J。当您在一行代码中执行此操作时,如果您求和最后你得到一个单一的值(所有 thetas 的总和)。
当您在上一个练习中一个一个地计算 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;
我正在学习 Andrew Ng 的机器学习课程,我正在努力研究多变量梯度下降的矢量化实现,这是课程中的可选练习。
这是有问题的算法(取自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
的解决方案到一般乘法解决方案),因为我能够使用 [=14 提出正确的实现=] 用于单个变量的梯度下降(尽管不是一个非常优雅的变量):
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 中实现算法有关。
大体的"rule of the thumb"如下,如果遇到这种形式的
SUM_i f(x_i, y_i, ...) g(a_i, b_i, ...)
然后你可以通过
轻松地将它矢量化(这就是上面所做的)f(x, y, ...)' * g(a, b, ...)
因为这只是一个典型的点积,在数学中(在有限维的欧几里得space中)看起来像
<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
如您所见,这是双向的,因为这只是点积的数学定义。
具体提到你问题的这一部分 - "I'm not sure how to multiply the sum of the hypothesis of x(i) - y(i) by the all variables xj(i)."
在 Octave 中,您可以将 xj(i) 乘以所有使用“.”的预测,因此它可以写成:
m = size(X, 1);
predictions = X * theta;
sqrErrors = (predictions-y).^2;
J = 1 / (2*m) * sum(sqrErrors);
向量乘法自动包括计算乘积之和。所以你不必指定 sum() 函数。通过使用 sum() 函数,您将向量转换为标量,这很糟糕。
您实际上不想在这里使用求和,因为您尝试计算的是所有 theta 的单个值,而不是总成本 J。当您在一行代码中执行此操作时,如果您求和最后你得到一个单一的值(所有 thetas 的总和)。 当您在上一个练习中一个一个地计算 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;