私は実際に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);
後者は機能します。なぜか分からない。逆行列の必要性を理解するのに苦労している。
あなたがステップを逃した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
最初の例では、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マトリックスになっています。
更新するときは、次のようにする必要があります
Start Loop {
temp0 = theta0 - (equation_here);
temp1 = theta1 - (equation_here);
theta0 = temp0;
theta1 = temp1;
} End loop
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