0

私は Matlab でコースを受講しており、勾配降下法を実装しましたが、正しくない結果が得られます。

コード:

for iter = 1:num_iters

sumTheta1 = 0;
sumTheta2 = 0;
for s = 1:m
    sumTheta1 = theta(1) + theta(2) .* X(s,2) - y(s);
    sumTheta2 = theta(1) + theta(2) .* X(s,2) - y(s) .* X(s,2);
end

theta(1) = theta(1) - alpha .* (1/m) .* sumTheta1;
theta(2) = theta(2) - alpha .* (1/m) .* sumTheta2;

J_history(iter) = computeCost(X, y, theta);

end

これが重要な部分です。最適化されていませんが、式の実装は正しいと思います。式は次のとおりです。

theta1 = theta1 - (alpha)(1/m)(summation_i^m(theta1 + theta2*x(i)-y(i)))
theta2 = theta2 - (alpha)(1/m)(summation_i^m(theta1 + theta2*x(i)-y(i)))(x(i))

では、どこに問題があるのでしょうか。

編集:コードが更新されました

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

for s = 1:m

sumTheta1 = ((theta(1) .* X(s,1)) + (theta(2) .* X(s,2))) - (y(s));
sumTheta2 = ((theta(1) .* X(s,1)) + (theta(2) .* X(s,2))) - (y(s)) .* X(s,2);
end

temp1 = theta(1) - alpha .* (1/m) .* sumTheta1;
temp2 = theta(2) - alpha .* (1/m) .* sumTheta2;

theta(1) = temp1;
theta(2) = temp2;

J_history(iter) = computeCost(X, y, theta);

end

end

編集 (2): 修正、作業コード。

わかった、それは +Dan のヒントでした。私は彼の答えを受け入れますが、行き詰まった人にはここにコードを入れます:)、乾杯。

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

sumTheta1 = 0;
sumTheta2 = 0;

for s = 1:m

sumTheta1 = sumTheta1 + ((theta(1) .* X(s,1)) + (theta(2) .* X(s,2))) - (y(s));
sumTheta2 = sumTheta2 + (((theta(1) .* X(s,1)) + (theta(2) .* X(s,2))) - (y(s))) .* X(s,2);
end

temp1 = theta(1) - alpha .* (1/m) .* sumTheta1;
temp2 = theta(2) - alpha .* (1/m) .* sumTheta2;

theta(1) = temp1;
theta(2) = temp2;

% Save the cost J in every iteration    
J_history(iter) = computeCost(X, y, theta);

end

end 
4

3 に答える 3

1

この式を見たら

theta1 = theta1 - (alpha)(1/m)(summation_i^m(theta1 + theta2*x(i)-y(i)))

私はmatlabの同等物は次のようになると思います:

theta1 = theta1 - alpha/m*(theta1 + theta2)*sum(x-y)

mおそらく、次のように判断できます。

m =length(x);

しかし、あなたの2つの式は、それらを順次計算するのか、同時に計算するのか疑問に思います.

2 番目のケースでは、一時変数を作成し、これを計算で使用します。

myFactor = alpha/m*(theta1_previous + theta2_previous)

theta1 = theta1_previous - myFactor*sum(x-y)
theta2 = theta2_previous - myFactor*sum((x-y).*x)
于 2013-10-16T09:39:19.160 に答える
1

一見したところ、sumTheta1実際には合計しているのではなく、反復ごとに自分自身を置き換えていることがわかります。私はあなたが意味したと思います:

sumTheta1 = sumTheta1 + theta(1) + theta(2) .* X(s,2) - y(s);

そして同じsumTheta2

しかし、将来の参考のために、この(修正された)ループを置き換えることができます:

for s = 1:m
    sumTheta1 = theta(1) + theta(2) .* X(s,2) - y(s);
    sumTheta2 = theta(1) + theta(2) .* X(s,2) - y(s) .* X(s,2);
end

このベクトル化された式で

sumTheta1 = sum(theta(1) + theta(2)*X(:,2) - y);
sumTheta2 = sum(theta(1) + theta(2)*X(:,2) - y.*X(:,2))
于 2013-10-16T06:25:46.610 に答える