web-dev-qa-db-ja.com

最急降下アルゴリズムのベクトル化

私はMATLABで最急降下法をコーディングしています。 2つの機能については、更新手順を実行します。

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;

ただし、このコードをベクトル化して、任意の数の機能に適用できるようにしたいと思います。ベクトル化の部分については、 shows 私がやろうとしているのは行列の乗算であること

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

これはよく見られますが、試してみると、パラメーターが同時に更新されないため、最急降下法では機能しないことがわかりました。

次に、このコードをベクトル化して、パラメーターと更新を同時に確認するにはどうすればよいですか?

18
bigTree

あなたのベクトル化は正しいです。また、両方のコードを試しましたが、同じシータが得られました。 2番目の実装では更新されたシータを使用しないことを忘れないでください。

これも機能しますが、2番目の実装ほど単純化されていません。

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

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

ベクトル化されたバージョンの場合、次のことを試してください(明示的に同時更新を行うための2つのステップ):

 gradient = (alpha/m) * X' * (X*theta -y)
 theta = theta - gradient
14
S.Arora

それらを同時に更新するには、シータ(1..n)の値を一時ベクトルに保持し、操作後に元のシータベクトルの値を更新する必要があります。

これは私がこの目的のために使用するコードです:

温度更新

tempChange = zeros(length(theta)、1);

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

実際の更新

---(theta = tempChage;

2
iatanasov

これは、オクターブで機能する最急降下法のベクトル化された形式です。
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

私はこのトピックに非常に慣れていませんが、それでも私の意見は次のとおりです。事前にX*thetaを計算し、ベクトル化された操作を行ってシータを調整する場合、一時的にする必要はありません。言い換えると、シータベクトルの更新中にX*thetaを計算すると、theta(1)はtheta(2)の前に更新されるため、X*thetaが変更されます。しかし、X*thetaをy_predとして計算し、シータでopをベクトル化すると、問題ありません。

だから私の提案は(tempを使用せずに):

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

私が間違っている場合は私を訂正してください。

0
Abhishek Jain
theta = theta - (alpha/m) * (X') * ((X*theta)-y)
0
Madhusudhan B A