點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

本文轉(zhuǎn)自 | 深度學(xué)習(xí)這件小事
當(dāng)用最小二乘法進(jìn)行線(xiàn)性回歸時(shí),在面對(duì)一堆數(shù)據(jù)集存在多重共線(xiàn)性時(shí),最小二乘法對(duì)樣本點(diǎn)的誤差極為敏感,最終回歸后的權(quán)重參數(shù)方差變大。這就是需要解決的共線(xiàn)性回歸問(wèn)題,一般思想是放棄無(wú)偏估計(jì),損失一定精度,對(duì)數(shù)據(jù)做有偏估計(jì),這里介紹兩種常用的算法:脊回歸和套索回歸。
多重共線(xiàn)性(Multicollinearity)是指線(xiàn)性回歸模型中的自變量之間由于存在高度相關(guān)關(guān)系而使模型的權(quán)重參數(shù)估計(jì)失真或難以估計(jì)準(zhǔn)確的一種特性,多重是指一個(gè)自變量可能與多個(gè)其他自變量之間存在相關(guān)關(guān)系。
例如一件商品的銷(xiāo)售數(shù)量可能與當(dāng)?shù)氐娜司杖牒彤?dāng)?shù)厝丝跀?shù)這兩個(gè)其他因素存在相關(guān)關(guān)系。
在研究社會(huì)、經(jīng)濟(jì)問(wèn)題時(shí),因?yàn)閱?wèn)題本身的復(fù)雜性,設(shè)計(jì)的因素很多。在建立回歸模型時(shí),往往由于研究者認(rèn)識(shí)水平的局限性,很難在眾多因素中找到一組互不相關(guān),又對(duì)因變量 y 產(chǎn)生主要影響的變量,不可避免地出現(xiàn)所選自變量出現(xiàn)多重相關(guān)關(guān)系的情形。
在前面的介紹中,我們已經(jīng)知道普通最小二乘法(OLS)在進(jìn)行線(xiàn)性回歸時(shí)的一個(gè)重要假設(shè)就是數(shù)據(jù)集中的特征之間不能存在嚴(yán)重的共線(xiàn)性。最迫切的是,我們?cè)谀玫揭欢褦?shù)據(jù)集時(shí),該如何診斷這些特征間是不是存在共線(xiàn)性問(wèn)題呢?
根據(jù)已有的參考文獻(xiàn),常用的多重共線(xiàn)性的診斷方法包括:方差膨脹因子法,特征根分析法,相關(guān)系數(shù)法等,基于這些方法的啟發(fā),本文初步地闡述個(gè)人的一些方法,不一定準(zhǔn)確,僅代表個(gè)人的理解。
我們可以繪制每個(gè)特征與 y 間的關(guān)系圖,然后肉眼對(duì)比每個(gè)特征對(duì) y 的影響情況,關(guān)系走勢(shì)圖相近的那些特征就是可能存在共線(xiàn)性的。
例如,下面所示的一個(gè)例子是房子的價(jià)值與兩個(gè)影響它的特征:特征1和特征2,方便起見(jiàn)我們選取了10個(gè)樣本點(diǎn)來(lái)進(jìn)行兩個(gè)特征間的相關(guān)性分析,在 Jupyter notebook中做了測(cè)試,代碼如下:
import matplotlib.pyplot as plt
X=np.array([[20.5,19.8],[21.2,20.4],[22.8,21.1],
[18.2,23.6],[20.3,24.9],[21.8,26.7],
[25.2,28.9],[30.7,31.3],[36.1,35.8],
y=np.array([7.8,8.6,8.7,7.9,8.4,8.9,10.4,11.6,13.9,15.8])
從散點(diǎn)圖中可以看出,這兩個(gè)特征和y的關(guān)系趨勢(shì)很相似,進(jìn)一步放到一起繪制折線(xiàn)圖:
可以看到這兩個(gè)特征與y的關(guān)系呈現(xiàn)出相同的曲線(xiàn)走勢(shì),我們初步這兩個(gè)特征可能具有相關(guān)性,這僅僅是在一個(gè)觀察層面。
怎么進(jìn)行量化分析呢?我們考慮具有一般性的公式,通常兩個(gè)變量間的相關(guān)系數(shù)的定義如下:
將上述公式,實(shí)現(xiàn)為代碼,如下所示:
cov = np.cov(X[:,0],X[:,1])
array([[ 70.44544444, 49.15144444],
[ 49.15144444, 41.24455556]])
r = cov[0,1]/(sigmaX1*sigmaX2)
相關(guān)系數(shù)為0.911,說(shuō)明特征1與特征2之間有高度的線(xiàn)性正相關(guān)關(guān)系。當(dāng)相關(guān)系數(shù)為0時(shí),表明沒(méi)有關(guān)系,為負(fù)數(shù)時(shí),表明特征1與特征2之間有負(fù)相關(guān)關(guān)系,即有一個(gè)這樣的你增我減,你減我增的趨勢(shì)。
如果忽略這個(gè)問(wèn)題,還是要采取普通最小二乘法來(lái)進(jìn)行回歸,可能導(dǎo)致的問(wèn)題簡(jiǎn)單來(lái)說(shuō)是造成權(quán)重參數(shù)估計(jì)值的方差變大。比如,樣本的特征如下:
A =np.array([[0.9999,2],[2,4],[4,8]]),y = np.array([1,2,3]),可以看到此時(shí)是強(qiáng)線(xiàn)性相關(guān)的,直接用直接求權(quán)重公式la.inv((A.T.dot(A))).dot(A.T).dot(y),得出參數(shù):
array([-1999.9998031, 1000.3999014]),
再降低一些線(xiàn)性相關(guān)強(qiáng)度:
A =np.array([[0.9900,2],[2,4],[4,8]]),得出參數(shù):
再降低,A =np.array([[0.900,2],[2,4],[4,8]]),得出參數(shù):
再降低A =np.array([[0.8,2],[2,4],[4,8]]),得出參數(shù):
再降低A =np.array([[0.5,2],[2,4],[4,8]]),得出參數(shù):
畫(huà)出以第一個(gè)權(quán)重參數(shù)隨著線(xiàn)性相關(guān)性的增加的趨勢(shì)圖:可以看到在0.9999時(shí)驟降,表明方差突然變大,變化幅度為2000左右。
拿掉0.9999這個(gè)特征取值后,變化幅度為20。
因此驗(yàn)證了多重共線(xiàn)性越強(qiáng),造成的后果:參數(shù)方差越大。
接下來(lái),嘗試改進(jìn)普通最小二乘法來(lái)解決共線(xiàn)性問(wèn)題。
正則化在機(jī)器學(xué)習(xí)中扮演者重要的角色,一方面它有可能解決經(jīng)常出現(xiàn)的過(guò)擬合問(wèn)題,另一方面能解決上文提到這種病態(tài)矩陣,也就是不適定問(wèn)題。對(duì)于正則化的理解,將會(huì)是以后機(jī)器學(xué)習(xí)需要反復(fù)仔細(xì)體會(huì)的一項(xiàng)重要技術(shù)。
在普通最小二乘法的基礎(chǔ)上,將代價(jià)函數(shù)加一個(gè)正則化項(xiàng),就可以解決共線(xiàn)性問(wèn)題,這個(gè)方法犧牲了權(quán)重參數(shù)的精度,帶來(lái)的收益是解決了共線(xiàn)性帶來(lái)的不穩(wěn)定。如果添加一個(gè)L1正則項(xiàng),算法稱(chēng)為套索回歸,如果添加一個(gè)L2正則化項(xiàng),稱(chēng)為脊回歸,公式分別表示為:
下面在Jupyter Notebook,直接調(diào)用sklearn庫(kù)中的回歸分析的API,分析上面的共線(xiàn)性數(shù)據(jù)在使用普通最小二乘,L1最小二乘(套索),L2最小二乘(脊回歸)下回歸樣本后,對(duì)新來(lái)的數(shù)據(jù)的預(yù)測(cè)精度。
我們用上節(jié)例子來(lái)闡述正則化項(xiàng)的作用,用的測(cè)試樣本如下所示:
X =np.array([[0.9999,2],[2,4],[4,8]])
from sklearn import linear_model
reg = linear_model.LinearRegression()
array([ 5000.00000002, -2499.75000001])
ridreg = linear_model.Ridge (alpha = .5)
array([ 0.12589929, 0.25173425])
ridreg = linear_model.Lasso(alpha = 0.1)
array([ 0. , 0.30535714])
可以看到脊回歸和套索回歸由于正則化項(xiàng)不同,最終導(dǎo)致的權(quán)重參數(shù)也一樣,最令人印象深刻的是,套索回歸由于使用了L1正則化,直接將特征1的權(quán)重參數(shù)置為0,也就是將強(qiáng)線(xiàn)性相關(guān)項(xiàng)中的某一個(gè)直接拋棄掉,只取其中一個(gè)特征項(xiàng)作為主特征項(xiàng)進(jìn)行分析計(jì)算。
OLS算法得出的權(quán)重參數(shù)在上節(jié)已經(jīng)驗(yàn)證過(guò),稍微改變一下線(xiàn)性相關(guān)的強(qiáng)度,導(dǎo)致的權(quán)重參數(shù)改變巨大,也就是參數(shù)的方差很大,這說(shuō)明它的不穩(wěn)定性。
在上節(jié)中,我們闡述了如何診斷多重共線(xiàn)性問(wèn)題,以及通過(guò)添加正則化項(xiàng)為什么可以解決這個(gè)問(wèn)題,在本文的論證中我們舉的例子是兩個(gè)特征間的共線(xiàn)性,這種方法簡(jiǎn)單直觀地進(jìn)一步驗(yàn)證了OLS權(quán)重參數(shù)的方差和共線(xiàn)性的關(guān)系,以及脊回歸和套索回歸加上正則化項(xiàng)后發(fā)揮的作用。
在本文論述中有些術(shù)語(yǔ)可能不夠精確,還請(qǐng)各位多包涵。謝謝各位的閱讀。
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。
下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講
在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車(chē)道線(xiàn)檢測(cè)、車(chē)輛計(jì)數(shù)、添加眼線(xiàn)、車(chē)牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。
下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱(chēng)+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~