Java 矢量化梯度下降算法

Java 矢量化梯度下降算法,java,python,matlab,machine-learning,linear-algebra,Java,Python,Matlab,Machine Learning,Linear Algebra,我正在用matlab编写梯度下降法。 对于两个功能,我得到了更新步骤: 但是,我希望将此代码矢量化,并能够将其应用于任意数量的功能。 对于矢量化部分,我想做的是矩阵乘法 这是显而易见的,但当我尝试时,我意识到它不适用于梯度下降,因为参数不会同时更新 那么,如何对代码进行矢量化,并确保同时更新参数和参数?您的矢量化是正确的。我也尝试了你的两个代码,得到了相同的θ。记住不要在第二个实现中使用更新的θ 这也可以工作,但比第二次实施更简单: Error = X * theta - y; for i =

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

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

这是显而易见的,但当我尝试时,我意识到它不适用于梯度下降,因为参数不会同时更新


那么,如何对代码进行矢量化,并确保同时更新参数和参数?

您的矢量化是正确的。我也尝试了你的两个代码,得到了相同的θ。记住不要在第二个实现中使用更新的θ

这也可以工作,但比第二次实施更简单:

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

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

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

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

临时更新

tempChange=0(长度(θ),1)

tempChage=θ-(α/m)*(X'*(X*θ-y))

实际更新


theta=tempChage

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


我对这个话题很陌生,但我的观点是: 如果您先计算
X*θ
,然后在执行矢量化操作以调整θ时,不需要处于temp。 换言之: 如果在更新θ向量时计算
X*θ
,则θ(1)在θ(2)之前更新,从而更改
X*θ
。 但是如果我们把X*θ作为y_pred来计算,然后对θ进行矢量化,就可以了

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


如果我错了,请纠正我

这是梯度下降的矢量化形式,它在倍频程中对我有效。
请记住,X是一个矩阵,第一列中有1(因为
theta\u 0*1
theta\u 0
)。对于X中的每一列,X中都有一个特征(n)。每一行都是一个训练集(m)。所以X是mx(n+1)矩阵。 y列向量可以是房价。 最好有一个成本函数来检查是否找到最小值。
为alpha a=0.001选择一个值,并在每次运行代码时尝试更改它。
num\u 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

请参见此处的完整说明:

为什么?这是同时更新所有特性的
theta
。然而,当我尝试两个特性时,我在第一个实现(使用临时变量)和第二个实现中得到了不同的结果。。。我不明白我发现了一个梯度下降的实现。我想这是不可能的“向量化更多”可能的复制我不明白:基本上,当θ有两个参数,我尝试了第一个版本(与温度)和第二个(“完全向量化”)。我尝试用这两个代码处理同一个问题,并对每个版本执行了1500次迭代。最后,我没有得到相同的结果,我可以看到第一个版本至少收敛得更快)(我在coursera ml类的第一次分配中尝试了这两个版本,显然结果不同)。我只尝试使用一个2*1向量作为θ,在一步之后,两个实现都得到了相同的新θ。我不确定代码的其他部分是否会影响结果。您可以跟踪每一步以观察θ的变化。顺便问一下,两个初始化θ是否相同?它们是设置为零还是随机数?θ显然不会改变s两种实现方式都是相同的。我不确定第二个版本是否收敛得更慢,或者是否没有执行正确的更新步骤。如果完全训练样本而不是按顺序训练样本,则收敛也应该是相同的。请解释一下……方程梯度=(alpha/m)*X'*(X*θ-y)..或者只是引导我找到一本书或一个url来解释它..谢谢你将矩阵更新之前的梯度(θ)预计算为两个步骤确保更新是同时进行的。因为第二步将是原子的。这一步应该是公认的答案,因为它更有效,因为它利用了向量化
Error = X * theta - y;
for i = 1:2
    S(i) = sum(Error.*X(:,i));
end

theta = theta - alpha * (1/m) * S'
 gradient = (alpha/m) * X' * (X*theta -y)
 theta = theta - gradient
theta = theta - (alpha/m) * (X') * ((X*theta)-y)
y_pred = X*theta %theta is [1;1] and X is mX2 matrix
theta = theta - (alpha/m) * (X' * (y_pred-y));
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