45

私は実際にこれに対して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);

後者は機能します。理由がわかりません。逆行列の必要性を理解するのに苦労しています。

4

7 に答える 7

78

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

   temp=X(:,2) * temp

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

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

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

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

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
于 2014-03-19T19:01:34.327 に答える
9

最初の例では、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行列になっています。

于 2012-05-16T22:47:40.597 に答える
9
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
于 2017-10-18T21:45:37.553 に答える
4

あなたが更新するとき、あなたは好きなことをする必要があります

Start Loop {

temp0 = theta0 - (equation_here);

temp1 = theta1 - (equation_here);


theta0 =  temp0;

theta1 =  temp1;

} End loop
于 2013-10-22T19:21:48.507 に答える
3

これは、より簡単にベクトル化できます。

h = X * theta   % m-dimensional matrix (prediction our hypothesis gives per training example)
std_err = h - y  % an m-dimensional matrix of errors (one per training example)
theta = theta - (alpha/m) * X' * std_err

Xは計画行列であることに注意してください。そのため、の各行はXトレーニング例を表し、の各列はXすべてのトレーニング例の特定のコンポーネント(たとえば、0番目または最初のコンポーネント)を表します。したがって、の各列は、シータベクトルの対応するコンポーネントを取得するために合計する前にX、要素ごとに乗算したいものです。std_err

于 2018-11-01T12:13:33.323 に答える
-3
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1 : num_iters
    hypothesis = X * theta;
    Error = (hypothesis - y);
    temp = theta - ((alpha / m) * (Error' * X)');
    theta = temp;
    J_history(iter) = computeCost(X, y, theta);
end
end
于 2019-03-19T19:59:12.117 に答える
-9
.
.
.
.
.
.
.
.
.
Spoiler alert












m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters

% ====================== YOUR CODE HERE ======================
% Instructions: Perform a single gradient step on the parameter vector
%               theta. 
%
% Hint: While debugging, it can be useful to print out the values
%       of the cost function (computeCost) and gradient here.
% ========================== BEGIN ===========================


t = zeros(2,1);
J = computeCost(X, y, theta);
t = theta - ((alpha*((theta'*X') - y'))*X/m)';
theta = t;
J1 = computeCost(X, y, theta);

if(J1>J),
    break,fprintf('Wrong alpha');
else if(J1==J)
    break;
end;


% ========================== END ==============================

% Save the cost J in every iteration    
J_history(iter) = sum(computeCost(X, y, theta));
end
end
于 2014-06-05T15:55:36.447 に答える