私は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));
これはよく見られますが、試してみると、パラメーターが同時に更新されないため、最急降下法では機能しないことがわかりました。
次に、このコードをベクトル化して、パラメーターと更新を同時に確認するにはどうすればよいですか?
あなたのベクトル化は正しいです。また、両方のコードを試しましたが、同じシータが得られました。 2番目の実装では更新されたシータを使用しないことを忘れないでください。
これも機能しますが、2番目の実装ほど単純化されていません。
Error = X * theta - y;
for i = 1:2
S(i) = sum(Error.*X(:,i));
end
theta = theta - alpha * (1/m) * S'
ベクトル化されたバージョンの場合、次のことを試してください(明示的に同時更新を行うための2つのステップ):
gradient = (alpha/m) * X' * (X*theta -y)
theta = theta - gradient
それらを同時に更新するには、シータ(1..n)の値を一時ベクトルに保持し、操作後に元のシータベクトルの値を更新する必要があります。
これは私がこの目的のために使用するコードです:
温度更新
tempChange = zeros(length(theta)、1);
tempChage = thetaalpha/m)*(X '*(X * theta-y));
実際の更新
---(theta = tempChage;
これは、オクターブで機能する最急降下法のベクトル化された形式です。
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
私はこのトピックに非常に慣れていませんが、それでも私の意見は次のとおりです。事前に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));
私が間違っている場合は私を訂正してください。
theta = theta - (alpha/m) * (X') * ((X*theta)-y)