使用"sum"在Octave中实现多个变量的梯度下降

Nob*_*lis 6 machine-learning octave gradient-descent

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

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

在此输入图像描述

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

theta = theta - alpha/m * sum(X * theta - y) * X;
Run Code Online (Sandbox Code Playgroud)

然而,正确的答案是完全不明显的(对于像我这样的线性代数初学者,从这里开始):

theta = theta - (alpha/m *  (X * theta-y)' * X)';
Run Code Online (Sandbox Code Playgroud)

对于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;
Run Code Online (Sandbox Code Playgroud)

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

lej*_*lot 4

一般的“经验法则”如下,如果您遇到以下形式的事情

SUM_i f(x_i, y_i, ...) g(a_i, b_i, ...)
Run Code Online (Sandbox Code Playgroud)

然后你可以轻松地对其进行矢量化(这就是上面所做的)

f(x, y, ...)' * g(a, b, ...)
Run Code Online (Sandbox Code Playgroud)

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

<A, B> = SUM_i A_i B_i = A'B
Run Code Online (Sandbox Code Playgroud)

因此

(X * theta-y)' * X)
Run Code Online (Sandbox Code Playgroud)

只是

<X * theta-y), X> = <H_theta(X) - y, X> = SUM_i (H_theta(X_i) - y_i) X_i
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这是双向的,因为这只是点积的数学定义。