2013-10-20 23 views
5

Mutiple değişkenler için matlabda gradyan alçalma yapıyorum ve kod normal eq ile aldığım beklenen sonuçları alamıyor. Bunlar: theta = 1.0407 Hayata geçirdim. Matlabda çok değişkenli degrade alçalma

Ve GDM'li

alıyorum sonuçları şunlardır: teta = 1.0e + 05 * 2,6618 -2,6718 -0,5954 Ve bu, belki bazı biri bana yardımcı ve söyleyebilir neden anlamıyorum bana koddaki hata nerede.

Kodu:

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 

teşekkürler.

DÜZENLEME: Veri.

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 

Tam veri kümesi.

+1

Lütfen içine güncellenmesi teta için müteakip iki döngü yerini alabilir

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

ile iç içe döngü yerini alabilir. – Daniel

+0

Elbette, pb büyük bir dosya değil. Bu yüzden koymuştum. :) –

+0

Sonra da dahil edilebilir ve başarısız olan yapay set oluşturun. Bu, veri tabanlı sorunlarda yardım istemenin tek geçerli yoludur. – lejlot

cevap

9

Tempoyu hesapladığınız satır yanlış. Ayrıca MATLAB'de matris işlemlerini kullanmayı deneyin. Kodunuz daha hızlı olacak ve anlaşılması daha kolay olacaktır. Örneğin, Eğer verileri içerecek bir satır

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

Teşekkürler, sonunda yaptı, nedenini biliyor olabilir miyim? Neydi o?? :) –

+0

X (m, t) vardı. m her zaman sabittir. Tüm hesaplamalar için son satırı X’de kullanıyordunuz. X (örnekler, t) doğru satırı kullanır. – Navan

+0

Evet, teşekkürler. Şimdi anlıyorum. –