MATLAB中多变量梯度下降

我在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';

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注