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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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