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

博主在学习机器学习的线性回归时遇到梯度下降算法不收敛的问题。他们在实现中使用了设计矩阵、特征和因变量,以RSS的梯度范数为收敛准则。然而,算法在迭代过程中RSS范数不断增大,导致无法收敛。通过参考Wikipedia关于梯度下降的页面,博主采用了Barzilai-Borwein方法更新学习率η,最终使得算法成功收敛。调整后的代码在每次迭代时更新η,解决了原问题。
摘要由CSDN通过智能技术生成

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

QB9TY.png

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

FW1wH.png

我很难让这个算法收敛,我想知道我是否忽略了我的实现中的某些东西。下面是代码。请注意,我还通过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。在

1f36207daee77605c3c593bdf781f28c.pngdef 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值