我在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));
这是很好看的,但是当我尝试时,我意识到它不适用于梯度下降,因为参数不会同时更新。
然后,我如何对此代码进行矢量化并确保参数并同时更新?
答案 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 *1
是thetha_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