阅读本文需要的背景知识点:标准线性回归算法、一丢丢编程知识

一、引言

  前面一节我们学习了机器学习算法系列(三)- 标准线性回归算法(Standard Linear Regression Algorithm),最后求得标准线性回归的代价函数的解析解 w 为:
w=(XTX)−1XTyw=\left(X^{T} X\right)^{-1} X^{T} y w=(XTX)−1XTy

  其中提到如果矩阵 X 的转置与矩阵 X 相乘后的矩阵不是满秩矩阵时,这个矩阵是不可逆的,还提到其本质是多个自变量 x 之间存在多重共线性。下面来介绍多重共线性的问题与解决这个问题的其中一个方法 - 岭回归1(Ridge Regression)

二、多重共线性

  先来看看多重共线性在维基百科中的解释:

多重共线性2(Multicollinearity)是指多变量线性回归中,变量之间由于存在精确相关关系或高度相关关系而使回归估计不准确。

  那么什么是精确相关关系与高度相关关系呢?假如有下面的(1)式,其中 w1=2、w2=3w_1 = 2、w_2 = 3w1​=2、w2​=3,同时如果又存在(2)式的关系,这时就说明 x1x_1x1​ 与 x2x_2x2​ 存在精确相关关系。当 x1x_1x1​ 与 x2x_2x2​ 之间存在近似精确相关关系,例如 x1x_1x1​ 约等于 2 倍的 x2x_2x2​,则说明存在高度相关关系。
{y=2x1+3x2(1)x2=2x1(2)\left\{\begin{array}{l} y=2 x_{1}+3 x_{2} & (1)\\ x_{2}=2 x_{1} & (2) \end{array}\right. {y=2x1​+3x2​x2​=2x1​​(1)(2)​

  因为由(2)式可以将(1)式改写成不同的形式,这样就会导致 w 存在无数种解,会使得最后的回归估计不准确。
⟹{y=2x1+3x2⇒w1=2w2=3y=8x1⇒w1=8w2=0y=4x2⇒w1=0w2=4y=6x1+x2⇒w1=6w2=1…\Longrightarrow\left\{\begin{array}{lll} y=2 x_{1}+3 x_{2} & \Rightarrow w_{1}=2 & w_{2}=3 \\ y=8 x_{1} & \Rightarrow w_{1}=8 & w_{2}=0 \\ y=4 x_{2} & \Rightarrow w_{1}=0 & w_{2}=4 \\ y=6 x_{1}+x_{2} & \Rightarrow w_{1}=6 & w_{2}=1 \\ \ldots & & \end{array}\right. ⟹⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​y=2x1​+3x2​y=8x1​y=4x2​y=6x1​+x2​…​⇒w1​=2⇒w1​=8⇒w1​=0⇒w1​=6​w2​=3w2​=0w2​=4w2​=1​

  根据 w 的解析解,可以通过下面的公式来求解其中的逆矩阵运算,被除数为矩阵的伴随矩阵3,除数为矩阵的行列式。可以看到矩阵可逆的条件是其行列式不能为零。
(XTX)−1=(XTX)∗∣XTX∣\left(X^TX\right)^{-1} = \frac{\left(X^TX\right)^*}{\mid X^TX \mid } (XTX)−1=∣XTX∣(XTX)∗​

  如果自变量之间存在多重共线性,会使得矩阵的行列式为零,导致矩阵不可逆。如下图中的示例 X,可以看到 x1x_1x1​ 与 x2x_2x2​ 存在精确相关关系,相乘后的矩阵经过初等变换4后其行列式为零,说明相乘后的矩阵的行列式也必然为零(初等变换不改变行列式为零的判断),这时的矩阵不可逆。如果自变量之间是高度相关关系,会使得矩阵的行列式近似等于零,这时所得的 w 的偏差会很大,也会造成回归估计不准确。
X=[112124136148]XT=[111112342468]XTX=[410201030602060120]⟶初等变换 [100012000]\begin{array}{c} X=\left[\begin{array}{lll} 1 & 1 & 2 \\ 1 & 2 & 4 \\ 1 & 3 & 6 \\ 1 & 4 & 8 \end{array}\right] \quad X^{T}=\left[\begin{array}{llll} 1 & 1 & 1 & 1 \\ 1 & 2 & 3 & 4 \\ 2 & 4 & 6 & 8 \end{array}\right] \\ X^{T} X=\left[\begin{array}{ccc} 4 & 10 & 20 \\ 10 & 30 & 60 \\ 20 & 60 & 120 \end{array}\right] \stackrel{\text { 初等变换 }}{\longrightarrow}\left[\begin{array}{lll} 1 & 0 & 0 \\ 0 & 1 & 2 \\ 0 & 0 & 0 \end{array}\right] \end{array} X=⎣⎢⎢⎡​1111​1234​2468​⎦⎥⎥⎤​XT=⎣⎡​112​124​136​148​⎦⎤​XTX=⎣⎡​41020​103060​2060120​⎦⎤​⟶ 初等变换 ​⎣⎡​100​010​020​⎦⎤​​

  多重共线性的问题既然是自变量之间存在相关关系,其中一个解决方法就是剔除掉共线的自变量,可以通过计算方差扩大因子5(Variance inflation factor,VIF)来量化自变量之间的相关关系,方差扩大因子越大说明自变量的共线性越严重。

  另一种方式是通过对代价函数正则化加入惩罚项来解决,其中一种正则化方式被称为吉洪诺夫正则化(Tikhonov regularization),这种代价函数正则化后的线性回归被称为岭回归(Ridge Regression)。

三、算法步骤

  岭回归的代价函数第一项与标准线性回归的一致,都是欧几里得距离的平方和,只是在后面加上了一个 w 向量的 L2-范数6 的平方作为惩罚项(L2-范数的含义为向量 W 每个元素的平方和然后开平方),其中 λ 表示惩罚项的系数,人为的控制惩罚项的大小。由于正则项是 L2-范数,有时这种正则化方式也被称为 L2 正则化。
Cost⁡(w)=∑i=1N(yi−wTxi)2+λ∥w∥22\operatorname{Cost}(w) = \sum_{i = 1}^N \left( y_i - w^Tx_i \right)^2 + \lambda\|w\|_{2}^{2} Cost(w)=i=1∑N​(yi​−wTxi​)2+λ∥w∥22​

  同标准线性回归一样,也是求使得岭回归的代价函数最小时 w 的大小:
w=argmin⁡w(∑i=1N(yi−wTxi)2+λ∥w∥22)w=\underset{w}{\operatorname{argmin}}\left(\sum_{i=1}^{N}\left(y_{i}-w^{T} x_{i}\right)^{2}+\lambda\|w\|_{2}^{2}\right) w=wargmin​(i=1∑N​(yi​−wTxi​)2+λ∥w∥22​)

  代价函数通过求导直接得到 w 的解析解,其中 X 为 N x M 矩阵,y 为 N 维列向量, λ 属于实数集,I 为 M x M 的单位矩阵。
w=(XTX+λI)−1XTyλ∈Rw=\left(X^{T} X+\lambda I\right)^{-1} X^{T}y \quad \lambda \in \mathbb{R} w=(XTX+λI)−1XTyλ∈R

X=[x1Tx2T⋮xNT]=[X11X12⋯X1MX21X22⋯X2M⋮⋮⋱⋮XN1XN2⋯XNM]y=(y1y2⋮yN)X=\left[\begin{array}{c} x_{1}^{T} \\ x_{2}^{T} \\ \vdots \\ x_{N}^{T} \end{array}\right]=\left[\begin{array}{cccc} X_{11} & X_{12} & \cdots & X_{1 M} \\ X_{21} & X_{22} & \cdots & X_{2 M} \\ \vdots & \vdots & \ddots & \vdots \\ X_{N 1} & X_{N 2} & \cdots & X_{N M} \end{array}\right] \quad y=\left(\begin{array}{c} y_{1} \\ y_{2} \\ \vdots \\ y_{N} \end{array}\right) X=⎣⎢⎢⎢⎡​x1T​x2T​⋮xNT​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎡​X11​X21​⋮XN1​​X12​X22​⋮XN2​​⋯⋯⋱⋯​X1M​X2M​⋮XNM​​⎦⎥⎥⎥⎤​y=⎝⎜⎜⎜⎛​y1​y2​⋮yN​​⎠⎟⎟⎟⎞​

四、原理证明

岭回归代价函数为凸函数
  同样需要证明:
f(x1+x22)≤f(x1)+f(x2)2f\left(\frac{x_{1}+x_{2}}{2}\right) \leq \frac{f\left(x_{1}\right)+f\left(x_{2}\right)}{2} f(2x1​+x2​​)≤2f(x1​)+f(x2​)​

  不等式左边:
Cost⁡(w1+w22)=∑i=1N[(w1+w22)Txi−yi]2+λ∥w1+w22∥22\operatorname{Cost}\left(\frac{w_{1}+w_{2}}{2}\right)=\sum_{i=1}^{N}\left[\left(\frac{w_{1}+w_{2}}{2}\right)^{T} x_{i}-y_{i}\right]^{2}+\lambda\left\|\frac{w_{1}+w_{2}}{2}\right\|_{2}^{2} Cost(2w1​+w2​​)=i=1∑N​[(2w1​+w2​​)Txi​−yi​]2+λ∥∥∥∥​2w1​+w2​​∥∥∥∥​22​

  不等式右边:
Cost⁡(w1)+Cost⁡(w2)2=∑i=1N(w1Txi−yi)2+∑i=1N(w2Txi−yi)2+λ∥w1∥22+λ∥w2∥222\frac{\operatorname{Cost}\left(w_{1}\right)+\operatorname{Cost}\left(w_{2}\right)}{2}=\frac{\sum_{i=1}^{N}\left(w_{1}^{T} x_{i}-y_{i}\right)^{2}+\sum_{i=1}^{N}\left(w_{2}^{T} x_{i}-y_{i}\right)^{2}+\lambda\left\|w_{1}\right\|_{2}^{2}+\lambda\left\|w_{2}\right\|_{2}^{2}}{2} 2Cost(w1​)+Cost(w2​)​=2∑i=1N​(w1T​xi​−yi​)2+∑i=1N​(w2T​xi​−yi​)2+λ∥w1​∥22​+λ∥w2​∥22​​

(1)不等式两边的前半部分与标准线性回归一致,只需要证明剩下的差值大于等于零即可
(2)将其改写成向量点积的形式
(3)展开括号
(4)合并相同的项,w1w_1w1​ 的转置乘 w2w_2w2​ 与 w2w_2w2​ 的转置乘 w1w_1w1​ 互为转置,又因为结果为实数,所以这个两项可以合并
(5)可以写成向量的平方的形式
Δ=λ∥w1∥22+λ∥w2∥22−2λ∥w1+w22∥22(1)=λ[w1Tw1+w2Tw2−2(w1+w22)T(w1+w22)](2)=λ(w1Tw1+w2Tw2−w1Tw1+w2Tw2+w1Tw2+w2Tw12)(3)=λ2(w1Tw1+w2Tw2−2w1Tw2)(4)=λ2(w1−w2)T(w1−w2)(5)\begin{aligned} \Delta &=\lambda\left\|w_{1}\right\|_{2}^{2}+\lambda\left\|w_{2}\right\|_{2}^{2}-2 \lambda\left\|\frac{w_{1}+w_{2}}{2}\right\|_{2}^{2} & (1) \\ &=\lambda\left[w_{1}^{T} w_{1}+w_{2}^{T} w_{2}-2\left(\frac{w_{1}+w_{2}}{2}\right)^{T}\left(\frac{w_{1}+w_{2}}{2}\right)\right] & (2) \\ &=\lambda\left(w_{1}^{T} w_{1}+w_{2}^{T} w_{2}-\frac{w_{1}^{T} w_{1}+w_{2}^{T} w_{2}+w_{1}^{T} w_{2}+w_{2}^{T} w_{1}}{2}\right) & (3) \\ &=\frac{\lambda}{2}\left(w_{1}^{T} w_{1}+w_{2}^{T} w_{2}-2 w_{1}^{T} w_{2}\right) & (4) \\ &=\frac{\lambda}{2}\left(w_{1}-w_{2}\right)^{T}\left(w_{1}-w_{2}\right) & (5) \end{aligned} Δ​=λ∥w1​∥22​+λ∥w2​∥22​−2λ∥∥∥∥​2w1​+w2​​∥∥∥∥​22​=λ[w1T​w1​+w2T​w2​−2(2w1​+w2​​)T(2w1​+w2​​)]=λ(w1T​w1​+w2T​w2​−2w1T​w1​+w2T​w2​+w1T​w2​+w2T​w1​​)=2λ​(w1T​w1​+w2T​w2​−2w1T​w2​)=2λ​(w1​−w2​)T(w1​−w2​)​(1)(2)(3)(4)(5)​

  不等式右边减去不等式左边的差值为平方式的连加运算加上两向量差的平方,人为的控制 λ 的大小,最后的结果在实数范围内必然大于等于零,证毕。

岭回归代价函数的解析解
(1)岭回归的代价函数
(2)前面三项为标准线性回归代价函数展开后的结果,w 的 L2-范数的平方可以写成向量 w 的点积
(3)合并第一项与第四项

Cost⁡(w)=∑i=1N(yi−wTxi)2+λ∥w∥22(1)=wTXTXw−2wTXTy+yTy+λwTw(2)=wT(XTX+λI)w−2wTXTy+yTy(3)\begin{aligned} \operatorname{Cost}(w) &=\sum_{i=1}^{N}\left(y_{i}-w^{T} x_{i}\right)^{2}+\lambda\|w\|_{2}^{2} & (1)\\ &=w^{T} X^{T} X w-2 w^{T} X^{T} y+y^{T} y+\lambda w^{T} w & (2)\\ &=w^{T}\left(X^{T} X+\lambda I\right) w-2 w^{T} X^{T} y+y^{T} y & (3) \end{aligned} Cost(w)​=i=1∑N​(yi​−wTxi​)2+λ∥w∥22​=wTXTXw−2wTXTy+yTy+λwTw=wT(XTX+λI)w−2wTXTy+yTy​(1)(2)(3)​

(1)代价函数对 w 求偏导数,根据向量求导公式,只有第一项和第二项与 w 有关,最后一项为常数,又因为代价函数是个凸函数,当对 w 的偏导数为 0 向量时,代价函数为最小值。
(2)将第二项移项后同时除以 2,再两边同时在前面乘以一个逆矩阵,等式左边的矩阵和逆矩阵乘后为单位矩阵,所以只剩下 w 向量。
∂Cost(w)⁡∂w=2(XTX+λI)w−2XTy=0(1)w=(XTX+λI)−1XTy(2)\begin{aligned} \frac{\partial \operatorname{Cost(w)}}{\partial w} &= 2(X^TX + \lambda I)w - 2X^Ty = 0 & (1) \\ w &= (X^TX + \lambda I)^{-1}X^Ty & (2) \end{aligned} ∂w∂Cost(w)​w​=2(XTX+λI)w−2XTy=0=(XTX+λI)−1XTy​(1)(2)​

  可以看到岭回归代价函数的解析解相较于标准线性回归来说多了一个可以人为控制的对角矩阵,这时可以通过调整不同的 λ 来使得括号内的矩阵可逆。
  在上一节的工作年限与平均月工资的例子中,X 为 一个 5 x 2 的矩阵,y 为一个 5 维列向量,当 λ 为 0.1 时,最后可以算得 w 为一个 2 维列向量,则这个例子的线性方程为 y=2139∗x−403.9y = 2139 * x - 403.9y=2139∗x−403.9。
X=[1112131415]y=(159838986220779910510)X = \begin{bmatrix} 1 & 1\\ 1 & 2\\ 1 & 3\\ 1 & 4\\ 1 & 5 \end{bmatrix} \quad y = \begin{pmatrix} 1598\\ 3898\\ 6220\\ 7799\\ 10510 \end{pmatrix} X=⎣⎢⎢⎢⎢⎡​11111​12345​⎦⎥⎥⎥⎥⎤​y=⎝⎜⎜⎜⎜⎛​159838986220779910510​⎠⎟⎟⎟⎟⎞​

w=(XTX+λI)−1XTy=(−403.92139.0)w = \left(X^TX + \lambda I\right)^{-1}X^Ty = \begin{pmatrix} -403.9\\ 2139.0 \end{pmatrix} w=(XTX+λI)−1XTy=(−403.92139.0​)

  可以看到加了惩罚项后,相较于标准线性回归的结果,拟合变差了,但是通过人为的控制惩罚项的大小,解决了自变量多重共线性的问题。

五、代码实现

使用 Python 实现线性回归算法:

import numpy as npdef ridge(X, y, lambdas=0.1):"""岭回归args:X - 训练数据集y - 目标标签值lambdas - 惩罚项系数return:w - 权重系数"""return np.linalg.inv(X.T.dot(X) + lambdas * np.eye(X.shape[1])).dot(X.T).dot(y)

六、第三方库实现

scikit-learn7 实现:

from sklearn.linear_model import Ridge# 初始化岭回归器
reg = Ridge(alpha=0.1, fit_intercept=False)
# 拟合线性模型
reg.fit(X, y)
# 权重系数
w = reg.coef_

七、示例演示

  下图展示了惩罚系数 λ 对各个自变量的权重系数的影响,横轴为惩罚系数 λ ,纵轴为权重系数,每一个颜色表示一个自变量的权重系数:

  可以看到当 λ 越大时( λ 向左移动),惩罚项占据主导地位,会使得每个自变量的权重系数趋近于零,而当 λ 越小时( λ 向右移动),惩罚项的影响越来越小,会导致每个自变量的权重系数震荡的幅度变大。在实际应用中需要多次调整不同的 λ 值来找到一个合适的模型使得最后的效果最好。

八、思维导图

九、参考文献

  1. https://en.wikipedia.org/wiki/Tikhonov_regularization
  2. https://en.wikipedia.org/wiki/Multicollinearity
  3. https://en.wikipedia.org/wiki/Adjugate_matrix
  4. https://en.wikipedia.org/wiki/Elementary_matrix
  5. https://en.wikipedia.org/wiki/Variance_inflation_factor
  6. https://en.wikipedia.org/wiki/Norm_(mathematics)
  7. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html

完整演示请点击这里

注:本文力求准确并通俗易懂,但由于笔者也是初学者,水平有限,如文中存在错误或遗漏之处,恳请读者通过留言的方式批评指正

本文首发于——AI导图,欢迎关注

机器学习算法系列(四)- 岭回归算法(Ridge Regression Algorithm)相关推荐

  1. 机器学习基础(三十一)—— 岭回归(Ridge Regression)到 LASSO

    如果数据集的特征比样本点还多(XN×d,d>NX_{N\times d},d> NXN×d​,d>N)怎么办?是否还可以使用线性回归来做预测?答案是否定的,因为在计算 (XTX)−1 ...

  2. 线性回归——lasso回归和岭回归(ridge regression)

    目录 线性回归--最小二乘 Lasso回归和岭回归 为什么 lasso 更容易使部分权重变为 0 而 ridge 不行? References 线性回归很简单,用线性函数拟合数据,用 mean squ ...

  3. 应用回归分析之岭回归(Ridge Regression,RR)

    一.岭回归估计的定义 1.1普通最小二乘法带来的问题 当自变量间存在复共线性时,回归系数估计的方差就会很大,从而导致估计值不稳定 1.2岭回归的定义 岭回归(Ridge Regression,RR), ...

  4. 机器学习笔记——岭回归(Ridge Regression)

    本内容整理自coursera,欢迎转载交流. (https://www.coursera.org/specializations/machine-learning) 1.一般回归遇到的问题 一般的回归 ...

  5. Python回归 岭回归(Ridge Regression)

    岭回归是一种专门用于共线性数据分析的有偏估计回归方法,实质上时改良的最小二乘估计法,通过放弃最小二乘法的无偏性(在反复抽样的情况下,样本均值的集合的期望等于总体均值),以损失部分信息.降低精度为代价获 ...

  6. 【python算法系列四】堆排序算法

    堆排序,就像它的名字一样,利用了堆的特性来进行排序.实现堆排序的思路是,把数组构建成一棵二叉树,并随着每次堆的变化更新堆顶的最大/最小值.堆排序的时间复杂度在所有情况下都是 O(nlgn),它也是一个 ...

  7. python机器学习库sklearn——岭回归(Ridge、RidgeCV)(L2正则化)

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 docker/kubernetes入门视频教程 全栈工程师开发手册 (作者:栾鹏) pyth ...

  8. 机器学习学习笔记(13)----岭回归(Ridge回归)

    在<机器学习学习笔记(4)----线性回归的数学解析>,我们通过计算线性模型的损失函数的梯度,得到使得损失函数为最小值的的解析解,被称之为普通最小二乘法:    (1) 公式(1)能够求得 ...

  9. 岭回归算法的原理和代码实战

    岭回归算法的原理和代码实战 前言 学过吴恩达老师的机器学习入门课程都应该知道,在逻辑回归那一讲,吴老师提到了使用正则化来防止逻辑回归模型过拟合.而岭回归在这里的作用是一样的,同样也是防止模型过拟合.这 ...

最新文章

  1. GARFIELD@11-07-2004
  2. 英特尔挖走AMD首席独显架构师,曾是现任CEO基辛格老部下
  3. 个性化选修——软件工程相关笔记
  4. SpringMVC源码分析(8)剖析ViewResolver
  5. win7下安装redies
  6. 深入分析新加坡金管局区块链计划 Ubin
  7. linux中setfacl命令,setfacl命令
  8. java四种线程池类型以及可选择的阻塞队列
  9. 微信小程序实现支付功能
  10. 信号的采样与插值重建(包含matlab)
  11. 安装kinnect v1驱动
  12. koa compose源码阅读
  13. ajax获取信息发送短信,javascript ajax获取信息功能代码
  14. 1041 Be Unique (20 分) 水题
  15. 朴素贝叶斯python实现预测_Python朴素贝叶斯预测.PDF
  16. 买腾讯云服务器怎么选择
  17. “安全删除硬件”图标 隐藏
  18. 2021-2027全球与中国双联式过滤器外壳市场现状及未来发展趋势
  19. 4个入口8条光缆!我们这样与世界连接
  20. Android 和 H5 交互-框架篇

热门文章

  1. linux jmap命令详解,jmap 详解
  2. NO.002-2018.02.07《越人歌》先秦:佚名
  3. 2021年Shopee急速入驻指南,快速审批获取专属开店链接!
  4. 看到一个经典的魔兽版评论,玩过的可以进来看看,超级搞笑!!
  5. 2019/1/12日更新Win7x86x64纯净安装旗舰版WIM下载(启用内置管理员).....
  6. dell服务器销售代表,【315】让DELL蒙羞的销售代表
  7. GBase 8a UNION用法
  8. Linux内核启动及文件系统加载过程
  9. 近5千侦探脑筋急转弯选择题ACCESS数据库
  10. Siege——压力测试