2013-10-20 144 views
5

我在matlab中爲多個變量做梯度下降,並且代碼沒有得到我用正常eq得到的預期理論值。即: theta = 1.0e + 05 * 3.4041 1.1063 -0.0665 隨着正常eq。我已經實施。matlab中的多變量梯度下降

並與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 

完整的數據集。

+1

請附上您的數據。 – Daniel

+0

哈確定沒有pb它是一個大文件。這就是爲什麼我沒有把它。 :) –

+0

然後創建包含並且失敗的人工設置。這是尋求基於數據的問題的唯一有效方法。 – lejlot

回答

9

您計算節奏的線路是錯誤的。它應該是

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成一行

theta = theta - alpha * (1/m) * result'; 
+0

謝謝你,終於做到了,我可以知道爲什麼嗎?那是什麼?? :) –

+0

你有X(m,t)。 m總是固定的。您正在使用X中的最後一行進行所有計算。 X(示例,t)使用正確的行。 – Navan

+0

是的,謝謝。我現在看到它。 –