線性回歸原理推導與應用(十一):多重共線性

多重共線性的定義與影響

多重共線性(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?+w1?x1?+w2?x2?+?+wn?xn?
其中:
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_1x1?x2x_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+7x2?y=5+7x1?y=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_2x1?2x2?,則行列式 ∣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=1?Ri2?VIF=1?Ri2?1?

這兩個指標中均涉及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?=α1?x2?+α2?x3?++αn?1?xn?x2?=θ1?x1?+θ2?x3?++θn?1?xn??xn?=δ1?x1?+δ2?x2?++δn?1?xn?1?
之后對于每個線性回歸模型計算決定系數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…