梯度下降法和正规方程的结果为何不同?

我正在编写一个简单的脚本,试图为我的假设找到值。我使用了一种是梯度下降法,另一种是正规方程。正规方程给出了正确的结果,但我的梯度下降法却不行。我无法理解为什么在这么简单的案例中它不起作用。

你好,我试图理解为什么我的梯度下降法在线性回归中与正规方程不匹配。我使用matlab来实现这两种方法。以下是我尝试的内容:

所以我创建了一个这样的虚拟训练集:

x = {1 2 3}, y = {2 3 4}

所以我的假设应该收敛到theta = {1 1},这样我得到一个简单的

h(x) = 1 + x;

这里是比较正规方程和梯度下降法的测试代码:

clear;disp("gradient descend");X = [1; 2; 3];y = [2; 3; 4];theta = [0 0];num_iters = 10;alpha = 0.3;thetaOut = gradientDescent(X, y, theta, 0.3, 10); % GD -> does not work, why?disp(thetaOut);clear;disp("normal equation");X = [1 1; 1 2; 1 3];y = [2;3;4];Xt = transpose(X);theta = pinv(Xt*X)*Xt*y; % normal equation -> works!disp(theta);

以下是梯度下降法的内部循环:

samples = length(y);for epoch = 1:iterations     hipoth = X * theta;     factor = alpha * (1/samples);     theta = theta - factor * ((hipoth - y)' * X )';     %disp(epoch);end

经过10次迭代后的输出如下:

gradient descend = 1.4284 1.4284 - > wrongnormal equation = 1.0000 1.0000 -> correct

这没有道理,它应该收敛到1,1。

有什么想法吗?我是否有matlab语法问题?

谢谢!


回答:

梯度下降法可以解决许多不同的问题。你想要进行线性回归,即找到一个线性函数h(x) = theta_1 * X + theta_2,最好地拟合你的数据:

h(X) = Y + 误差

什么是最好的拟合,是有争议的。最常见的方式是通过最小化拟合与实际数据之间误差的平方来定义最佳拟合。假设这是你想要的…

将函数替换为

function [theta] = gradientDescent(X, Y, theta, alpha, num_iters)n = length(Y);    for epoch = 1:num_iters        Y_pred = theta(1)*X + theta(2);        D_t1 = (-2/n) * X' * (Y - Y_pred);        D_t2 = (-2/n) * sum(Y - Y_pred);        theta(1) = theta(1) - alpha * D_t1;        theta(2) = theta(2) - alpha * D_t2;    endend

并稍微调整你的参数,例如

num_iters = 10000;alpha = 0.05;

你会得到正确答案。我从这里获取了代码片段,这也可能提供一个很好的起点来阅读这里实际发生的事情。

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中创建了一个多类分类项目。该项目可以对…

发表回复

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