2013-10-20 99 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

是的,谢谢。我现在看到它。 –