[英]Multi variable gradient descent in matlab
I'm doing gradient descent in matlab for mutiple variables, and the code is not getting the expected thetas I got with the normal eq. 我在matlab中为多个变量做渐变下降,并且代码没有达到我用正常eq得到的预期值。 that are: theta = 1.0e+05 * 3.4041 1.1063 -0.0665 With the Normal eq.
即:theta = 1.0e + 05 * 3.4041 1.1063 -0.0665使用Normal eq。 I have implemented.
我已经实施了。
And with the GDM the results I get are: theta = 1.0e+05 * 2.6618 -2.6718 -0.5954 And I don't understand why is this, maybe some one can help me and tell me where is the mistake in the code. 而对于GDM我得到的结果是:theta = 1.0e + 05 * 2.6618 -2.6718 -0.5954我不明白为什么会这样,也许有人可以帮助我并告诉我代码中的错误在哪里。
Code: 码:
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
Thanks. 谢谢。
EDIT: Data. 编辑:数据。
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
Full dataset. 完整数据集。
The line where you calculate tempo is wrong. 计算速度的行是错误的。 It should be
它应该是
tempo(examples) = ((theta' * X(examples, :)') - y(examples)) * X(examples,t)
Also try using matrix operations in MATLAB. 还尝试在MATLAB中使用矩阵运算。 Your code will be faster and it will also be easier to understand.
您的代码会更快,也更容易理解。 For example, you can replace your nested loop with
例如,您可以使用替换嵌套循环
E = X * theta - y;
for t = 1:thetas
result(t) = sum(E.*X(:,t));
end
You can replace your subsequent two loop for updating theta into one line 您可以替换后续的两个循环以将theta更新为一行
theta = theta - alpha * (1/m) * result';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.