5

複数の変数に対してmatlabで勾配降下を行っていますが、コードは通常の式で得た予想されるシータを取得していません。つまり: theta = 1.0e+05 * 3.4041 1.1063 -0.0665 実施しました。

そして、GDMで得られる結果は次のとおりです。 theta = 1.0e+05 * 2.6618 -2.6718 -0.5954 なぜこれなのかわかりません。誰かが私を助けて、コードのどこに間違いがあるか教えてくれるかもしれません。

コード:

function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)

m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
thetas = size(theta,1);
features = size(X,2)

mu = mean(X);
sigma = std(X);
mu_size = size(mu);
sigma_size = size(sigma);

%for all iterations
for iter = 1:num_iters

tempo = [];

result = [];

theta_temp = [];

%for all the thetas    
for t = 1:thetas
    %all the examples
    for examples = 1:m
       tempo(examples) = ((theta' * X(examples, :)') - y(examples)) * X(m,t)
    end

    result(t) = sum(tempo)
    tempo = 0;

end

%theta temp, store the temp 
for c = 1:thetas

    theta_temp(c) = theta(c) - alpha * (1/m) * result(c)
end

%simultaneous update
for j = 1:thetas

    theta(j) = theta_temp(j)

end

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

end

theta
end

ありがとう。

編集: データ。

  X =
    1.0000    0.1300   -0.2237
    1.0000   -0.5042   -0.2237
    1.0000    0.5025   -0.2237
    1.0000   -0.7357   -1.5378
    1.0000    1.2575    1.0904
    1.0000   -0.0197    1.0904
    1.0000   -0.5872   -0.2237
    1.0000   -0.7219   -0.2237
    1.0000   -0.7810   -0.2237
    1.0000   -0.6376   -0.2237
    1.0000   -0.0764    1.0904
    1.0000   -0.0009   -0.2237
    1.0000   -0.1393   -0.2237
    1.0000    3.1173    2.4045
    1.0000   -0.9220   -0.2237
    1.0000    0.3766    1.0904
    1.0000   -0.8565   -1.5378
    1.0000   -0.9622   -0.2237
    1.0000    0.7655    1.0904
    1.0000    1.2965    1.0904
    1.0000   -0.2940   -0.2237
    1.0000   -0.1418   -1.5378
    1.0000   -0.4992   -0.2237
    1.0000   -0.0487    1.0904
    1.0000    2.3774   -0.2237
    1.0000   -1.1334   -0.2237
    1.0000   -0.6829   -0.2237
    1.0000    0.6610   -0.2237
    1.0000    0.2508   -0.2237
    1.0000    0.8007   -0.2237
    1.0000   -0.2034   -1.5378
    1.0000   -1.2592   -2.8519
    1.0000    0.0495    1.0904
    1.0000    1.4299   -0.2237
    1.0000   -0.2387    1.0904
    1.0000   -0.7093   -0.2237
    1.0000   -0.9584   -0.2237
    1.0000    0.1652    1.0904
    1.0000    2.7864    1.0904
    1.0000    0.2030    1.0904
    1.0000   -0.4237   -1.5378
    1.0000    0.2986   -0.2237
    1.0000    0.7126    1.0904
    1.0000   -1.0075   -0.2237
    1.0000   -1.4454   -1.5378
    1.0000   -0.1871    1.0904
    1.0000   -1.0037   -0.2237

y =
      399900
      329900
      369000
      232000
      539900
      299900
      314900
      198999
      212000
      242500
      239999
      347000
      329999
      699900
      259900
      449900
      299900
      199900
      499998
      599000
      252900
      255000
      242900
      259900
      573900
      249900
      464500
      469000
      475000
      299900
      349900
      169900
      314900
      579900
      285900
      249900
      229900
      345000
      549000
      287000
      368500
      329900
      314000
      299000
      179900
      299900
      239500

完全なデータセット。

4

1 に答える 1

8

テンポを計算する行が間違っています。そのはず

tempo(examples) = ((theta' * X(examples, :)') - y(examples)) * X(examples,t)

また、MATLAB で行列演算を使用してみてください。コードが高速になり、理解しやすくなります。たとえば、ネストされたループを次のように置き換えることができます

E = X * theta - y;
for t = 1:thetas
    result(t) = sum(E.*X(:,t));
end

theta を更新するための後続の 2 つのループを 1 行に置き換えることができます

theta = theta - alpha * (1/m) * result';
于 2013-10-21T15:53:10.983 に答える