当前位置:   article > 正文

Python手写岭回归算法_岭回归的py实现

岭回归的py实现

理论

岭回归在最小二乘法的基础上加上了一个 l 2 l_2 l2惩罚项
假设函数: h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n hθ(x)=θ0+θ1x1+θ2x2++θnxn

损失函数: J ( θ ) = 1 2 m ∑ i = 1 m [ ( ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ) ] J\left(\theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{[({{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta _{j}^{2}})]} J(θ)=2m1i=1m[((hθ(x(i))y(i))2+λj=1nθj2)]

损失函数的矩阵形式: J ( θ ) = ( y − X θ ) T ( y − X θ ) + λ θ T θ J(\theta)= (y - X\theta)^T (y - X\theta) + \lambda \theta^T \theta J(θ)=(y)T(y)+λθTθ

其中:

  • y y y 是一个 n × 1 n \times 1 n×1的向量,包含了所有的因变量。
  • X X X 是一个 n × p n \times p n×p的矩阵,其中 n n n是样本数, p p p 是特征数。
  • θ \theta θ 是一个 p × 1 p \times 1 p×1的向量,包含了所有的回归系数。
  • λ \lambda λ 是正则化参数,控制惩罚的强度。
  • T ^T T 表示矩阵转置。

正规方程推导过程

回归算法的参数估计可以通过正规方程来求解。正规方程是一种闭合形式的解,适用于求解线性方程组。在岭回归中,我们添加了一个正则化项,以便在存在共线性的情况下稳定参数估计。下面是岭回归正规方程的推导过程:

要找到最小化损失函数的参数 θ \theta θ,我们对损失函数关于 θ \theta θ 求导并设为零:

∂ ∂ θ [ ( y − X θ ) T ( y − X θ ) + λ θ T θ ] = 0 \frac{\partial}{\partial \theta} \left[ (y - X\theta)^T (y - X\theta) + \lambda \theta^T \theta \right] = 0 θ[(y)T(y)+λθTθ]=0

展开并简化上式:

  1. 对第一项 ( y − X θ ) T ( y − X θ ) (y - X\theta)^T (y - X\theta) (y)T(y) 求导得到:
    − 2 X T ( y − X θ ) -2X^T(y - X\theta) 2XT(y)

  2. 对第二项 λ θ T θ \lambda \theta^T \theta λθTθ 求导得到:
    2 λ θ 2\lambda\theta 2λθ

因此,我们有:

− 2 X T ( y − X θ ) + 2 λ θ = 0 -2X^T(y - X\theta) + 2\lambda\theta = 0 2XT(y)+2λθ=0

简化上述等式:

X T y − X T X θ + λ θ = 0 X^T y - X^T X\theta + \lambda\theta = 0 XTyXT+λθ=0

将上述等式重新排列,以解出 θ \theta θ

X T X θ + λ θ = X T y X^T X\theta + \lambda\theta = X^T y XT+λθ=XTy

合并 θ \theta θ 相关的项:

( X T X + λ I ) θ = X T y (X^T X + \lambda I)\theta = X^T y (XTX+λI)θ=XTy

其中 I I I 是单位矩阵。

最后,解出 θ \theta θ

θ = ( X T X + λ I ) − 1 X T y \theta = (X^T X + \lambda I)^{-1} X^T y θ=(XTX+λI)1XTy

这就是岭回归的正规方程。需要注意的是,由于加入了 λ I \lambda I λI,正则化项确保了 X T X + λ I X^TX + \lambda I XTX+λI 矩阵是可逆的(或者更准确地说,是正定的),这在处理共线性特征时特别重要,因为在普通最小二乘回归中 X T X X^T X XTX 可能是奇异的或接近奇异的。

梯度下降法

一般形式:

重复以下步骤 直到收敛:

θ 0 : = θ 0 − λ 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) ) {\theta_0}:={\theta_0}-\lambda \frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}}) θ0:=θ0λm1i=1m((hθ(x(i))y(i))x0(i))

θ j : = θ j − λ [ 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j ] {\theta_j}:={\theta_j}-\lambda [\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}] θj:=θjλ[m1i=1m((hθ(x(i))y(i))xj(i)+mλθj]

j = 1 , 2 , . . . n j=1,2,...n j=1,2,...n

θ j : = θ j ( 1 − α λ m ) − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) {\theta_j}:={\theta_j}(1-\alpha \frac{\lambda }{m})-\alpha \frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}} θj:=θj(1αmλ)αm1i=1m(hθ(x(i))y(i))xj(i)

λ \lambda λ是控制模型复杂度的因子,可看做收缩率的大小。 λ \lambda λ越大,收缩率越大,系数对于共线性的鲁棒性更强

矩阵形式:

批量梯度下降

θ = ( 1 − λ α m ) θ − α m X T ( X θ − Y ) \theta=(1-\lambda \frac \alpha m) \theta - \frac {\alpha} m {X}^T({X\theta} -{Y}) θ=(1λmα)θmαXT(Y)

小批量梯度下降

θ = ( 1 − λ α m ) θ − α M X M T ( X M θ − Y M ) \theta=(1-\lambda \frac \alpha m) \theta - \frac {\alpha} M {X_M}^T({X_M\theta} -{Y_M}) θ=(1λmα)θMαXMT(XMθYM)

其中 M M Mbatch_size X M X_M XM表示 M M M条数据, Y M Y_M YM X M X_M XM对应的 y y y的值。

随机梯度下降

θ = ( 1 − λ α m ) θ − α X ( i ) T ( X ( i ) θ − Y ( i ) ) \theta=(1-\lambda \frac {\alpha} m) \theta - {\alpha} {X^{(i)}}^T({X^{(i)}\theta} -{Y^{(i)}}) θ=(1λmα)θαX(i)T(X(i)θY(i))

Python实现

下述代码详细的实现了矩阵计算方法、梯度下降法、批量梯度下降法、随机梯度下降法四种方法:
https://github.com/xiligey/npml/blob/master/npml/linear_model/ridge.py

运行测试代码结果如下:
https://github.com/xiligey/npml/blob/master/test/test_ridge.py

矩阵法系数:[[3.1976789 ]
[2.18770957]]
批量梯度下降法系数:[[3.1976789 ]
[2.18770957]]
小批量梯度下降法系数:[[3.25664069]
[2.03215727]]
随机梯度下降法系数:[[3.21467618]
[2.30263593]]
sklearn的岭回归回归系数:(array([[2.17620422]]), array([3.21107145]))

批量梯度下降法
小批量梯度下降法
随机梯度下降法

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/591050
推荐阅读
相关标签
  

闽ICP备14008679号