我正在编写一个简单的脚本,试图为我的假设找到值。我使用了一种是梯度下降法,另一种是正规方程。正规方程给出了正确的结果,但我的梯度下降法却不行。我无法理解为什么在这么简单的案例中它不起作用。
你好,我试图理解为什么我的梯度下降法在线性回归中与正规方程不匹配。我使用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;
你会得到正确答案。我从这里获取了代码片段,这也可能提供一个很好的起点来阅读这里实际发生的事情。