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