web-dev-qa-db-ja.com

オクターブでの勾配降下法の実装

私は実際に2か月ほどこれに苦労しています。これらが違うのは何ですか?

hypotheses= X * theta
temp=(hypotheses-y)'
temp=X(:,1) * temp
temp=temp * (1 / m)
temp=temp * alpha
theta(1)=theta(1)-temp

hypotheses= X * theta
temp=(hypotheses-y)'
temp=temp * (1 / m)
temp=temp * alpha
theta(2)=theta(2)-temp



theta(1) = theta(1) - alpha * (1/m) * ((X * theta) - y)' * X(:, 1);
theta(2) = theta(2) - alpha * (1/m) * ((X * theta) - y)' * X(:, 2);

後者は機能します。なぜか分からない。逆行列の必要性を理解するのに苦労している。

36
narthur157

あなたがステップを逃した2番目のブロックの最初の例で何をしているのですか? Xを1のベクトルと連結すると仮定しています。

   temp=X(:,2) * temp

最後の例は機能しますが、さらにベクトル化してより単純で効率的にすることができます。

機能は1つしかないと仮定しました。複数の機能で同じように機能します。それは、各機能のXマトリックスに追加の列を追加するだけだからです基本的に、1のベクトルをxに追加して、切片をベクトル化します。

1行のコードでthetasの2x1マトリックスを更新できます。 xが1のベクトルを連結してnx2行列にすると、シータベクトル(2x1)を乗算してh(x))を計算できます。これは(X * theta)ビットです。

ベクトル化の2番目の部分は、(X * theta)-y)を転置することです。これにより、X(n * 2行列)を掛けると基本的に両方(h(x)-y)x0を集約する1 * n行列が得られますおよび(h(x)-y)x1。定義により、両方のシータが同時に行われます。これにより、新しいシータの1 * 2行列が得られます。これを再度転置して、ベクトルを反転させてシータベクトルと同じ次元にします。その後、アルファによる単純なスカラー乗算とthetaによるベクトル減算を行うことができます。

X = data(:, 1); y = data(:, 2);
m = length(y);
X = [ones(m, 1), data(:,1)]; 
theta = zeros(2, 1);        

iterations = 2000;
alpha = 0.001;

for iter = 1:iterations
     theta = theta -((1/m) * ((X * theta) - y)' * X)' * alpha;
end
65
Shaun Ryan

最初の例では、Xが3x2行列で、シータが2x1行列の場合、「仮説」は3x1行列になります。

Yが3x1マトリックスであると仮定すると、(仮説-y)を実行して3x1マトリックスを取得でき、その3x1の転置はtempに割り当てられた1x3マトリックスです。

次に、1x3行列はtheta(2)に設定されますが、これは行列であってはなりません。

上記のmxnの例を使用すると、コードの最後の2行が機能します。

(X * theta)

3x1マトリックスになります。

次に、その3x1行列からy(3x1行列)が減算され、結果は3x1行列になります。

(X * theta) - y

したがって、3x1行列の転置は1x3行列です。

((X * theta) - y)'

最後に、1x3マトリックスと3x1マトリックスの積は、スカラーまたは1x1マトリックスに等しくなります。既にご存知でしょうが、念のため、X(:、2)は3x2マトリックスの2列目であり、3x1マトリックスになっています。

9
Justin Nafe

更新するときは、次のようにする必要があります

Start Loop {

temp0 = theta0 - (equation_here);

temp1 = theta1 - (equation_here);


theta0 =  temp0;

theta1 =  temp1;

} End loop
4
hbr
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
% Performs gradient descent to learn theta. Updates theta by taking num_iters 
% gradient steps with learning rate alpha.

% Number of training examples
m = length(y); 
% Save the cost J in every iteration in order to plot J vs. num_iters and check for convergence 
J_history = zeros(num_iters, 1);

for iter = 1:num_iters
    h = X * theta;
    stderr = h - y;
    theta = theta - (alpha/m) * (stderr' * X)';
    J_history(iter) = computeCost(X, y, theta);
end

end
4
skeller88