当前位置: 首页 > news >正文

线性回归原理推导与应用(十一):多重共线性

多重共线性的定义与影响

多重共线性(Multicollinearity)是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。

根据定义和影响程度,可以将多重共线性分为极端共线性和一般共线性。极端共线性一般是指变量间有准确的相关关系,例如x1=x2+1,x3=3x2x_1= x_2+ 1,x_3= 3x_2x1=x2+1,x3=3x2等,一般共线性则是指自变量高度相关。

多重共线性对模型的影响

光看定义比较抽象,所以下面我们结合多元线性回归的原理具体说明一下什么是多重共线性以及其对线性模型的影响。

在多元线性回归中,我们使用多个自变量来预测因变量,其方程可以表示为:
y=w0+w1x1+w2x2+⋯+wnxny =w_0 + w_1x_1 + w_2x_2 + \cdots + w_nx_ny=w0+w1x1+w2x2++wnxn
其中:
x1,x2,…,xnx_1, x_2, …, x_nx1,x2,,xn 表示不同的自变量,w1,w2,…,wnw_1, w_2, …, w_nw1,w2,,wn 表示各个自变量对应的回归系数。

对模型参数的影响

现在假设有这样一个多元线性回归方程模型:
y=10+2x1+5x2y = 10 + 2x_1 + 5x_2y=10+2x1+5x2
假设 x1x_1x1x2x_2x2 之间存在强相关性,我们可以将它们的关系表示为:
x1=x2+1x_1= x_2+ 1x1=x2+1
那么,原始方程可以转化为以下几种形式:
y=12+7x2y=5+7x1y=7.5+4.5x1+2.5x2⋯y = 12 + 7x_2 \\ y = 5 + 7x_1\\ y = 7.5 + 4.5x_1 + 2.5x_2 \\ \cdots y=12+7x2y=5+7x1y=7.5+4.5x1+2.5x2
可以发现如果存在多重共线性,可以得到一系列不同回归系数下自变量的组合,这些回归模型的回归系数不同,但得到的预测值yyy完全相同(自变量精确相关,极端共线性)或相差不大(自变量高度相关,一般共线性),此时不同模型下的误差平方和相同或相差不大,都可能是恰当的模型,所以如果存在多重共线性,会导致模型的截距项(intercept)和系数(coefficients)无法确定,回归系数可能有很大波动,例如可能由正变负,还可能变为0等等。

对求解过程的影响

在之前的多元回归原理的推导中我们讲解并推导了最小二乘法求解的过程,如果对这一方面不熟悉的可以看一下这篇文章:https://smilecoc.blog.csdn.net/article/details/138210463,在这里我们推导出求解参数的矩阵形式:
w=(XTX)−1XTYw=(X^TX)^{−1}X^TYw=(XTX)1XTY
可以看到计算公式中需要计算逆矩阵 w=(XTX)−1w=(X^TX)^{−1}w=(XTX)1,且(XTX)−1=(XTX)∗∣XTX∣(X^{T}X)^{-1}=\frac{(X^{T}X)^*}{|X^{T}X|}(XTX)1=XTX(XTX),当存在共线性时,若
(1)自变量存在精确相关关系,则行列式 ∣XTX∣|X^{T}X|XTX 为0,矩阵不可逆,不存在逆矩阵。即此时求不出
的最小二乘估计。
(2)自变量存在高度相关关系,比如 x1≈2x2x_1\approx 2x_2x12x2,则行列式 ∣XTX∣|X^{T}X|XTX 近似为0,由于处在计算公式的分母上,此时计算得到的回归系数的偏差会很大。

多重共线性的判断

那么如何判断变量之间是否有多重共线性呢?一般可以通过方差膨胀因子(Variance inflation factor,VIF)和容忍度(tolerance,T)来诊断多重共线性,VIF和容忍度两者互为倒数,两者的计算公式分别为:
T=1−Ri2VIF=11−Ri2T={1-R_i^2}\\[15pt]VIF=\frac{1}{1-R_i^2}T=1Ri2VIF=1Ri21

这两个指标中均涉及R方,先来复习一下这个概念:R方是回归分析中的一个关键概念,也称为决定系数(coefficient of determination),记作R2R^2R2R2R^2R2用于评估回归模型对数据的拟合优度。例如,R2=0.9R^2= 0.9R2=0.9 意味着目标变量yyy中90%的变化可以由模型中的自变量解释。R2R^2R2的具体计算原理和公式在之前的线性回归系列文章中也有说明过,感兴趣的可以查看。

VIF如何判断出多重共线性呢?VIF首先为每个自变量拟合一个线性回归模型,使用其余的自变量作为预测变量。
x1=α1x2+α2x3+…+αn−1xnx2=θ1x1+θ2x3+…+θn−1xn⋯xn=δ1x1+δ2x2+…+δn−1xn−1x_1 = \alpha_1 x_2 + \alpha_2x_3 + … + \alpha_{n-1}x_n\\ x_2 = \theta_1 x_1 + \theta_2x_3 + … + \theta_{n-1}x_n \\ \cdots \\ x_n = \delta_1 x_1 + \delta_2x_2 + … + \delta_{n-1}x_{n-1} x1=α1x2+α2x3++αn1xnx2=θ1x1+θ2x3++θn1xnxn=δ1x1+δ2x2++δn1xn1
之后对于每个线性回归模型计算决定系数R2R^2R2。每个自变量,每个回归方程都可以计算出对应的R2R^2R2值(记为Ri2R_i^2Ri2),表示其他自变量能够解释该自变量变变化的程度。使用上面的VIF计算公式即可计算出每个自变量对应的VIF值。

一般地,当VIF的最大值>10(Ri2>0.9R_i^2 > 0.9Ri2>0.9)时,则认为有严重的共线性,建议处理,如果5≤VIF<10(0.8≤Ri2<0.9)5 ≤ VIF < 10(0.8 ≤R_i^2 < 0.9)5VIF<10(0.8Ri2<0.9)时,则认为有轻度共线性,需关注。

Python计算VIF

Python计算VIF的方法有:使用statsmodels库、使用pandas和numpy库手动计算,这里使用statsmodels库,它提供了一个名为variance_inflation_factor()的函数来计算VIF

import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor# 示例数据集
data = {'X1': [1, 2, 3, 4, 5],
'X2': [2, 4, 5, 8, 9],
'X3': [29, 3, 7, 18, 6],
'Y': [1, 2, 3, 4, 5]
}df = pd.DataFrame(data)#在计算VIF之前,我们需要移除目标变量,只保留自变量
X = df[['X1', 'X2', 'X3']]
vif_data = pd.DataFrame()
vif_data['Feature'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(len(X.columns))]
print(vif_data)

运行代码后即可得到每一个自变量的VIF值。

  Feature         VIF
0      X1  256.918238
1      X2  266.626208
2      X3    1.835335

从结果可以看出前两个自变量存在很强的共线性。

如何消除多重共线性

最后来说一下如何消除多重共线性。

进行建模时,首先需要计算两两相关系数,将相关系数较高的变量去除。这一步相当于对变量进行一次初筛,注意:这一步只是降维,不保证消除多重共线性,因为 3 个以上变量仍可能“抱团”。

其次在建模中,可以使用岭回归,Lasso回归等正则化收缩回归系数来减轻多重共线性的影响,并可以删除系数趋近于0的变量。

最后可以计算VIF值,当VIF值过大的时候就需要对变量进行处理。

除了直接删除变量外,如果有的时候不好删除变量,可以使用PCA等降维方法保留大部分的变量信息。

参考文章:
https://zhuanlan.zhihu.com/p/355241680
https://avoid.overfit.cn/post/512ff1c71eb14f758ff82a94baf06f4c
在这里插入图片描述

http://www.dtcms.com/a/353064.html

相关文章:

  • 20250827的学习笔记
  • Kubernetes(k8s) 常用命令
  • 从零开始学习JavaWeb-19
  • 解决跨运营商限速:在飞牛OS系统上启用BBR算法优化网络速度
  • 数据结构:单链表的应用(力扣算法题)第一章
  • 腾讯云人脸识别API技术深度解析:从算法原理到工程实践
  • Diagnosing bias and variance|诊断偏差和方差
  • 文件系统中的核心数据结构
  • 链表-25.k个一组翻转链表-力扣(LeetCode)
  • 镜中万象:论观察即存在的递归拓扑与生命的意识本质
  • FPGA的工作原理
  • AI赋能CRM:纷享销客访销大脑重构快消品销售策略
  • d435i相机读取镜头内参和相对之间的外参
  • 三方相机问题分析八:【返帧异常导致性能卡顿】Snapchat后置使用特效预览出现卡顿
  • Jmeter5.3性能测试:文件下载脚本编写后,导出文件的接收
  • 第五章:Go运行时、内存管理与性能优化之栈与堆内存分配 (逃逸分析)
  • 在语言模型监督式微调(SFT)中的 负对数似然(Negative Log-Likelihood, NLL)等价于最大化似然
  • 开发者如何在 Gitee 上开源一个自己的项目
  • 开源 C++ QT Widget 开发(七)线程--多线程及通讯
  • keepalived mysql 主从复制 容器实现(失败)
  • JVM之【Java对象在内存中的结构】
  • windows下 docker desktop 清理ext4.vhdx文件 并缩小ext4.vhdx文件
  • 二次校验请求源 IP 是否在 WAF 官方 IP 段内” + “校验是否携带 WAF 专属 HTTP 头
  • 基于Spark的白酒行业数据分析与可视化系统的设计与实现
  • [后端快速搭建]基于 Django+DeepSeek API 快速搭建智能问答后端
  • 域名、ip、DSN、URL
  • springbootr如何调用dolphinshceduler
  • 【记录】R|Windows 下的 R studio 安装调研准备工作、安装过程以及 ggplot2 包的引入测试
  • GIP电路
  • leetcode 974 和可被K整除的子数组