多重共线性的定义与影响

多重共线性(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.pswp.cn/pingmian/95018.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95018.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95018.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day082-初识ElasticStack

文章目录0. 老男孩思想-人性十大需求1. ElasticStack介绍1.1 ELK&#xff08;**Elastic Stack**&#xff09;1.2 logstash和filebeat的区别2. ElasticSearch单点部署2.1 下载ElasticSearch软件包2.2 安装软件并修改配置文件2.3 启动并测试服务3. ElasticSearch集群部署3.1 安装…

软考 系统架构设计师系列知识点之杂项集萃(139)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(138) 第257题 系统工程利用计算机作为工具,对系统的结构、元素、()和反馈等进行分析,以达到最优()、最优设计、最优管理和最优控制的目的。霍尔(A.D.Hall)于1969年提出了系统方法的三维结构体系,通常称为霍…

solidity地址、智能合约、交易概念

目录地址address 的两种子类型&#xff08;Solidity 0.5.0&#xff09;address分类address 的常用操作和属性总结交易交易的基本结构&#xff08;由外部发起&#xff09;Gas交易生命周期函数调用与交易常见交易场景总结地址 在 Solidity 中&#xff0c;地址&#xff08;addres…

jwt原理及Java中实现

一、JWT 是什么&#xff1f;解决什么问题&#xff1f; 我们先来一张图看一下这个过程&#xff1a;JWT&#xff08;JSON Web Token&#xff09;是一种把“认证信息&#xff08;Claims&#xff09; 完整性校验”打包成 自包含 的字符串的规范。 它主要用于无状态认证&#xff1a;…

大数据在UI前端的应用深化研究:用户行为数据的跨平台关联分析

大数据在UI前端的应用深化研究&#xff1a;用户行为数据的跨平台关联分析每天&#xff0c;你在手机 App 里点了一个按钮、在网页上滑了两屏、又在小程序里停留了 3 秒&#xff0c;这些看似零散的动作&#xff0c;其实都在被悄悄记录。过去&#xff0c;这些数据只能各自躺在自己…

C++11基础——— 右值引用和移动语义

1. C11的发展历史 C11是C的第⼆个主要版本&#xff0c;并且是从C98起的最重要更新。它引入了大量更改&#xff0c;标准化了既有实践&#xff0c;并改进了对C程序员可用的抽象。在它最终由ISO在2011年8月12日采纳前&#xff0c;人们曾使用名称“C0x”&#xff0c;因为它曾被期待…

【一】Django框架版本介绍

【一】Django框架版本介绍 【一】Django框架版本 ● Django 是一个高级的Python Web框架&#xff0c;由荷兰人Armin Ronacher创建。 ● 随着版本的迭代和功能的不断优化&#xff0c;Django在处理异步请求方面也有了显著的进步。 【1】Django1.x ● 默认不支持异步 ● Django 1.…

git 大文件上传不了的 问题

你 还是在 cmd 里执行&#xff0c;Select-String 是 PowerShell 的命令&#xff0c;cmd 不认识。 请务必按下面的步骤 切换到 PowerShell 再运行。✅ 1. 打开 PowerShell&#xff08;不要再用 cmd&#xff09;最简单&#xff1a; 在资源管理器里进入 D:\linShiWenjian\my-react…

【FIX】go运行报错“missing go.sum entry for module providing package”解决方案

&#x1f527; ​核心解决方案​**运行 go mod tidy**​ ​作用​&#xff1a;自动同步 go.mod和 go.sum文件&#xff0c;添加缺失依赖并移除无用条目。 go mod tidy​适用场景​&#xff1a;90% 的校验和缺失问题可通过此命令解决。 ​注意​&#xff1a;若项目含私有仓库&…

【实操教学】ArcGIS 如何进行定义坐标系

一、坐标系定义的方式创建数据时可直接完成坐标系定义&#xff1b;针对已创建的数据集&#xff08;涵盖要素类、要素数据集及栅格数据集&#xff09;&#xff0c;则可通过以下这种方式定义&#xff1a;工具箱工具调用&#xff1a;使用 ArcGIS 工具箱中的 “定义投影&#xff08…

如何使用Windows自带的PnPUtil命令来禁用/停用和启用硬件设备

我来详细讲解一下如何使用 Windows 自带的 PnPUtil 命令来禁用&#xff08;停用&#xff09; 和启用硬件设备。 PnPUtil (即插即用实用工具) 是一个功能强大的命令行工具&#xff0c;主要用于安装、卸载、枚举和修改驱动程序包。对于硬件的启用和禁用&#xff0c;它通过操作设…

鸿蒙Next媒体展示组件实战:Video与动态布局全解析

今天我们来深入探讨HarmonyOS Next中几种核心媒体展示组件的使用方法&#xff0c;通过实际代码示例展示如何打造丰富的多媒体体验。HarmonyOS Next为开发者提供了一套强大而灵活的媒体展示组件&#xff0c;使开发者能够轻松实现视频播放、动态布局适应、全屏切换等常见多媒体功…

复现RoboDK机器人校准功能(以Staubli TX2‑90L / TX200机械臂为测试对象,实测精度接近原厂)

本算法复现了 RoboDK 的机器人校准功能&#xff1a;在训练集的理论校准后精度与 RoboDK 一致&#xff0c;在测试集的实测精度接近 Staubli 原厂。 参考&#xff1a;RoboDK 机器人校准功能&#xff08;https://robodk.com.cn/cn/robot-calibration&#xff09; 特性 支持 SDH 参…

Vue常用指令和生命周期

Vue 是基于 MVVM模型的前端 JavaScript 框架。Vue 核心是数据驱动视图&#xff0c;通过响应式数据实现视图自动更新。<template><div>{{ message }}</div><button click"changeMsg">修改内容</button> </template><script se…

深度学习周报(8.25~8.31)

目录 摘要 Abstract 1 RNN学习意义 2 RNN基础知识 2.1 核心思想 2.2 传播 2.3 优缺点 2.4 变体结构与应用场景 3 RNN结构代码示例 4 总结 摘要 本周主要学习了循环神经网络的学习意义与基础知识&#xff0c;重点了解了RNN循环连接的核心思想、前向传播与反向传播过程…

借助 LAMBDA 公式,实现单元格区域高效转换

新特性介绍 “转换单元格&#xff08;Transform&#xff09;” 功能允许用户将自定义的单参数 LAMBDA 公式应用于选中的单元格区域。用户可选择公式参数的作用域 —— 按单元格、按行、按列或按整个区域。 转换完成后&#xff0c;源单元格区域会被清空&#xff0c;转换后的区…

LeetCode 01背包 494. 目标和

494. 目标和给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前…

Dify 1.8.0 全网首发,预告发布

距离Dify 1.7.2过去两周了 Dify 1.8.0 又跟大伙见面了&#xff01; 1.8.0&#xff0c;属于主版本号不变、但第二位数字更新的“阶段性大更”&#xff0c;意味着功能上的显著优化和体验上的重要升级。 根据官方的Github日志&#xff0c;这一版本将继续聚焦三大核心方向&#x…

基于LangChain框架搭建AI问答系统(附源码)

AI问答系统1. 背景知识2. 问答系统流程3. 知识问答系统相关组件3.1 文档加载器3.2 文档切割器3.3 嵌入模型包装器3.4 向量存储库3.5 模型包装器3.6 链组件4. 问答系统演示4.1 问答程序4.2 演示大模型回答效果5.问答系统代码1. 背景知识 在人工智能技术飞速发展的今天&#xff…

【Python】QT(PySide2、PyQt5):Qt Designer,VS Code使用designer,可能的报错

Qt designer&#xff1a;可直接在designer界面&#xff0c;使用拖拽的方式设计需要的界面&#xff0c;可设定部分属性。安装Pyside2后&#xff0c;designer默认在python安装目录的Lib/sit_packages/PySide2文件夹中。designer使用&#xff1a;① 双击打开designer.exe&#xff…