我在MATLAB中对多个变量进行梯度下降,代码得到的theta值与我通过正常方程得到的预期theta值不符,正常方程得到的theta值为:theta = 1.0e+05 * 3.4041 1.1063 -0.0665,我已经实现了正常方程。
而使用梯度下降法得到的结果是: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
完整数据集。
回答:
你计算tempo的那一行有错误。应该改为
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';