Matlab中的多变量梯度下降 [英] Multi variable gradient descent in matlab

查看:131
本文介绍了Matlab中的多变量梯度下降的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在matlab中对多个变量进行梯度下降,并且代码未获得正常等式所得到的预期theta.那是: θ= 1.0e + 05 * 3.4041 1.1063 -0.0665 与普通等式.我已经执行了.

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. that are: theta = 1.0e+05 * 3.4041 1.1063 -0.0665 With the Normal eq. I have implemented.

使用GDM,我得到的结果是: θ= 1.0e + 05 * 2.6618 -2.6718 -0.5954 而且我不明白为什么会这样,也许有人可以帮助我,告诉我代码中的错误在哪里.

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.

代码:

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

完整数据集.

推荐答案

计算速度的行是错误的.应该是

The line where you calculate tempo is wrong. It should be

tempo(examples) = ((theta' * X(examples, :)') - y(examples)) * X(examples,t)

也可以尝试在MATLAB中使用矩阵运算.您的代码将更快,并且也将更易于理解.例如,您可以将嵌套循环替换为

Also try using matrix operations in 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

您可以替换随后的两个循环以将theta更新为一行

You can replace your subsequent two loop for updating theta into one line

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

这篇关于Matlab中的多变量梯度下降的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆