线性回归的梯度下降实现问题

2024-05-19 21:55:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习机器学习/线性回归。下面是他们如何描述用于求解估计的OLS系数的梯度下降算法:

enter image description here

因此,他们使用w作为系数,H用于设计矩阵(或他们所称的特性),而{}用于因变量。它们的收敛准则通常是RSS的梯度范数小于容限epsilon;也就是说,它们对“不收敛”的定义是:

enter image description here

我很难让这个算法收敛,我想知道我是否忽略了我的实现中的某些东西。下面是代码。请注意,我还通过statsmodels regression library运行了我在其中使用的示例数据集(df),只是为了看看回归可以收敛,并得到要绑定的系数值。是的,他们是:

Intercept    4.344435
x1           4.387702
x2           0.450958

这是我的实现。在每次迭代中,它都会打印RSS渐变的范数:

^{pr2}$

不幸的是,这并没有收敛,事实上打印出一个随着每次迭代而爆炸的规范:

1 : 44114.31506051333
2 : 98203544.03067812
3 : 218612547944.95386
4 : 486657040646682.9
5 : 1.083355358314664e+18
6 : 2.411675439503567e+21
7 : 5.368670935963926e+24
8 : 1.1951287949674022e+28
9 : 2.660496151835357e+31
10 : 5.922574875391406e+34
11 : 1.3184342751414824e+38
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
......
Exception: Failed to converge

如果我增加了足够多的最大迭代次数,它不会收敛,只会爆炸到无穷大。在

这里是否存在实现错误,或者我误解了课堂笔记中的解释?在

更新w/答案

正如@Kant建议的那样,eta需要在每次迭代中更新。课程本身就有一些例子公式,但没有一个有助于收敛。This section of the Wikipedia page about gradient descent提到Barzilai-Borwein approach是更新eta的好方法。我实现了它并修改了代码,以便在每次迭代时用它更新eta,回归成功地收敛了。下面是我将Wikipedia版本的公式翻译成回归中使用的变量,以及实现它的代码。同样,在我原来的ols_gradient_descent的循环中调用此代码来更新eta。在

enter image description here

def eta_t (w_t, w_t_minus_1, grad_t, grad_t_minus_1):
    delta_w = w_t - w_t_minus_1
    delta_grad = grad_t - grad_t_minus_1

    eta_t = (delta_w.T @ delta_grad) / (LA.norm(delta_grad))**2

    return eta_t

Tags: 代码算法范数exceptionwikipedia公式etarss