機器學習實戰 ch08 1回歸之嶺回歸

2021-07-16 21:36:37 字數 2177 閱讀 8024

對於乙個統計學知識匱乏的工科生,還真得好好補補。通過各種資訊檢索,終於有了一點理解,同時發現了統計學真的很重要,比如金融、生物(尤基因)等與大量資料相關的領域。

嶺回歸:是一種專用於共線性資料分析的有偏估計回歸方法,實質上是一種改良的最小二乘估計法,通過放棄最小二乘法的無偏性,以損失部分資訊、降低精度為代價,獲得回歸係數更為符合實際、更可靠的回歸方法,對病態資料的耐受性遠遠強於最小二乘法。

總結起來看,主要有兩個原因:

①當樣本少於特徵(資料點少於變數個數),輸入資料的矩陣x非滿秩矩陣(即|xtx|≈0),求逆的時候會出問題;

②當樣本之間存在共線性(也就是強相關性),普通的最小二乘法得到到的回歸係數估計得方差很大,會導致估計值很不穩定;

嶺回歸的原理較為複雜。根據高斯馬爾科夫定力,多重相關性並不影響最小二乘法估計量的無偏性和最小方差性,但是,雖然最小二乘估計量在所有線性估計量中是方差最小的,但是這個方差都不一定小,而實際上可以找到乙個有偏估計量,這個估計量雖然有較小的偏差,但它的精度卻能夠大大高於無偏的估計量。嶺回歸分析就是根據這個原理,通過在正規方程中引入有偏常熟二求的回歸估計量的

嶺回歸的做法是在xtx上加上乙個「懲罰項」λi從而使得矩陣非奇異,進而能求逆

此時,回歸係數的計算公式是: ω^

=(xt

x+λi

)−1x

ty

(1)各回歸係數的嶺估計基本穩定;

(2)用最小二乘估計時符號不合理的回歸係數,其嶺估計的符號變得合理;

(3)回歸係數沒有不合乎經濟意義的絕對值;

(4)殘差平方和增大不太多。

但實際操作,就是取」平穩拐點「

#給定lam下的嶺回歸的求解

defridgeregres

(xmat,ymat,lam=0.2):

xtx = xmat.t * xmat

denom = xtx + eye(shape(xmat)[1])*lam #eye()是numpy用於生成單位矩陣的函式

if linalg.det(denom) == 0.0:

print

"this matrix is singular, cannot do inverse"

return

ws = denom.i * (xmat.t * ymat)

return ws

#測試嶺回歸的求解效果

defridgetest

(xarr,yarr):

xmat = mat(xarr)

ymat = mat(yarr).t

ymean = mean(ymat,0) #np.mean(a,axis):沿著axis方向求算術平均值

ymat =ymat - ymean

xmeans = mean(xmat,0)

xvar = var(xmat,0) #np.var(a,axis):沿著axis方向求方差

xmat =(xmat - xmeans)/xvar #資料標準化操作:所有特徵值都減去各自的均值並除以方差

numtestpts = 30

#生成30個不同lam以測試ridgeregres

wmat = zeros((numtestpts,shape(xmat)[1]))

for i in range(numtestpts):

ws = ridgeregres(xmat,ymat,exp(i-10))

wmat[i,:] = ws.t

return wmat

乙個致命缺點,主觀性性太大,基本我們學習下來發現,選取k值和刪除x分量,基本都要靠目測,因此不適合大資料和機器學習思想。於是lasso的出現,就是改進的嶺回歸演算法。

《機器學習實戰》學習筆記 10 回歸 嶺回歸

機器學習實戰 學習筆記 10 回歸 嶺回歸 縮減方法可以去除不重要的引數 備註 同樣,為使用嶺回歸和縮減技術,首先需要對特徵做標準化處理,標準化使得每維度下的特徵有相同的重要性,具體 所有特徵減去各自的均值並除以方差 機器學習實戰 回歸 from numpy import def loaddatas...

《機器學習實戰》學習筆記 12 回歸 樹回歸

機器學習實戰 學習筆記 12 回歸 樹回歸 分類與回歸樹 classification and regression trees,cart 是由四人幫leo breiman,jerome friedman,richard olshen與charles stone於1984年提出,既可用於分類也可用於...

機器學習8回歸問題

對於之前在分類問題中有邏輯回歸,而對於這個線性回歸以前一般是先講述,將線性回歸的結果通過函式對映到 0,1 區間,再以0.5作為區分形成分類問題。具體的計算方法,在以前的blogs提到過,參考 下面就直接實戰 跟之前一樣,第一步匯入資料。def loaddataset filename numfea...