矢量化梯度下降算法

时间:2013-12-23 03:07:20

标签: matlab machine-learning linear-algebra gradient-descent

我在matlab中编写梯度下降。 对于两个功能,我得到了更新步骤:

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

但是,我希望对此代码进行矢量化,并能够将其应用于任意数量的功能。 对于矢量化部分,我想要做的是was pointed out to me矩阵乘法

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

这是很好看的,但是当我尝试时,我意识到它不适用于梯度下降,因为参数不会同时更新。

然后,我如何对此代码进行矢量化并确保参数并同时更新?

6 个答案:

答案 0 :(得分:13)

对于矢量化版本,请尝试以下操作(显式同步更新的两个步骤):

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

答案 1 :(得分:9)

你的矢量化是正确的。我也尝试了你的两个代码,它让我得到了同样的理论。请记住,在第二次实施中不要使用更新的theta。

这也可以比第二次实现更简单:

Error = X * theta - y;
for i = 1:2
    S(i) = sum(Error.*X(:,i));
end

theta = theta - alpha * (1/m) * S'

答案 2 :(得分:2)

为了同时更新它们,您需要将theta(1..n)的值保留在临时向量中,并且在操作之后只需更新原始theta向量中的值。

这是我用于此目的的代码:

  

临时更新

tempChange =零(长度(theta),1);

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

  

实际更新

theta = tempChage;

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我是很新的这个话题,还是我的看法是: 如果您事先进行过X*theta的计算,则在进行矢量化操作来调整theta时,不必处于临时状态。 换一种说法: 如果计算X*theta,同时更新THETA矢量,θ-THETA(2),并且因此(1)之前的更新改变X*theta。 但是,如果我们将X*theta计算为y_pred,然后对theta进行向量矢量化,就可以了。

所以我的建议是(不使用temp):

y_pred = X*theta %theta is [1;1] and X is mX2 matrix
theta = theta - (alpha/m) * (X' * (y_pred-y));

如果我错了,请纠正我。

答案 5 :(得分:0)

这是梯度下降的矢量化形式,它对我来说是八度。
请记住,X是第一列中带有1的矩阵(因为theta_0 *1thetha_0)。对于X中的每一列,您在X中都有一个特征(n)。每一行都是一个训练集(m)。所以X a m X(n + 1)矩阵。 y列向量可以是房价。 拥有成本函数来检查是否找到最小值是一件好事。
为alpha选择一个值,可能是a = 0.001,并在每次运行代码时尝试更改它。 num_iters是您希望其运行的时间。

function theta = gradientDescent(X, y, theta, alpha, num_iters)

m = length(y); % number of training examples


 for iter = 1:num_iters

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


 end

end

在此处查看完整说明:https://www.coursera.org/learn/machine-learning/resources/QQx8l