機器學習演算法實踐:標準與局部加權線性回歸

來源:伯樂在線 - iPytLab

如有好文章投稿,請點擊 → 這裡了解詳情

前言

最近開始總結學習回歸相關的東東了,與分類的目標變數是標稱型不同,回歸是對連續型數據進預測。當然還是從最簡單的線性回歸開始,本文主要介紹無偏差的標準線性回歸和有偏局部加權線性回歸的理論基礎以及相應的Python實現。

標準線性回歸

標準線性回歸的理論知識很簡單,我們既可以寫出它的標量表達式也可以寫成矩陣的形式,其中矩陣的形式也可以通過投影矩陣進行推到得到。本部分就對標準線性回歸的表達式進行下簡單的推導。

給定一組數據其中包括特徵矩陣X, 目標變數向量y:

其中X第一列為截距項,我們做線性回歸是為了得到一個最優回歸係數向量w使得當我們給定一個x能夠通過y=xw預測y的值。其中

最小二乘法獲取回歸係數

那麼怎樣的w才是最優的呢?在標準線性回歸中我們需要找到是誤差最小的w, 即預測的y值與真實的y值之間的差值,為了避免簡單累加造成的正負差值相互抵消,這裡採用了平方誤差:

對於上述式子f(w)可以通過梯度下降等方法得到最優解。但是使用矩陣表示將會是的求解和程序更為簡單:

將f(w)對w求導可得:

使其等於0,便可得到:

通過投影矩陣獲取回歸係數

除了通過最小平方差的方法推導得到w的表達式,我們還可以通過投影矩陣(Projection Matrix)來得到。

我們知道如果我們能夠求得一個w使得Xw=y肯定是最好的,但是實際情況中y一般並不在矩陣X的列空間中,也就是此方程無解,於是我們希望通過將向量y投影到X的列空間中得到投影矩陣p, 然後求解Xw=p來獲取一個最接近的一個解, 矩陣X的投影矩陣形式為

於是得到y在X列空間的投影為

此時方程Xw=p是有解的,得到最接近Xw=y的解為:

標準線性回歸的Python實現

通過矩陣形式我么可以很方便的通過Numpy的介面進行矩陣運算獲取線性回歸係數向量w? , 實現如下:

defstd_linreg(X,Y):

xTx=X.T*X

ifnp.linalg.det(xTx)==0:

print("xTx is a singular matrix")

return

returnxTx.I*X.T*Y

通過對現有數據進行標準線性回歸併繪製回歸直線得到如下圖(完整代碼和數據見: https://github.com/PytLab/MLBox/tree/master/linear_regression)

w = [3.00774324, 1.69532264]

相關係數(Correlation Coefficient)計算

如何判斷獲得的模型預測能力的好壞呢?我們需要計算模型計算得到的yy的值向量與實際yy值向量的匹配程度, 也就是計算相關係數Correlation Coefficient。

相關係數的計算公式:

也就是兩個數據序列的協方差併除上各自的標準差,本質上就是一種剔除了兩個變數量綱影響、標準化後的特殊協方差。

而協方差便是衡量兩個變數變化趨勢是否相似的一種方法,是同向變化(同時變大或變小)還是反向變化(一個變大一個變小), 同向或者反向的程度如何,計算公式如下:

通過公式可以看出,如果對於向量中的每個x,y同時大於或同時小於各自的期望值,協方差為正,相反則為負。可見如果協方差越大相似程度就越高,協方差越小相似程度就越小。也可以看到如果X,Y相同,協方差就是方差,也就是方差是一種特殊情況下的協方差。

關於協方差與相關係數的通俗解釋可以參考知乎上的回答:如何通俗易懂地解釋「協方差」與「相關係數」的概念?

雖然Numpy中有計算協方差的介面numpy.corrcoef,是分別對兩兩向量進行比較並計算協方差,得到協方差矩陣。為了練習,我還是稍微自己計算了下協方差並只計算兩列不同數據之間的相關係數:

defget_corrcoef(X,Y):

# X Y 的協方差

cov=np.mean(X*Y)-np.mean(X)*np.mean(Y)

returncov/(np.var(X)*np.var(Y))**0.5

通過對上面得到的線性回歸模型得到的預測的值與實際的值進行相關係數計算可以得到相關係數為

Correlation coeffient: 0.9864735622335125

局部加權線性回歸(Local Weighted Linear Regression)

上面的數據點是通過公式y=3+1.7x+0.1sin(30x)添加雜訊生成的數據,而標準的線性回歸是一種無偏差估計,在計算所有點的時候都是無偏差的計算誤差並通過優化方法優化誤差,如果針對不同的點能夠對誤差進行調整便可以一定程度上避免標準線性回歸帶來的欠擬合現象。

也就是引入偏差來降低預測的均方誤差,本部分總結下局部加權線性回歸的方法。當我們獲取某個xx的預測值的時候,我們需要計算回歸係數w,但是如果針對樣本中的數據,距離x越近我們就給個越大的權重,如果距離越遠就給一個小的權重,這樣就會使得針對x的預測值ypredict能夠更貼合樣本數據。

當我們需要對數據點xx相應的目標值進行預測的時候,我們需要給樣本中的每個點賦予一個權重值wi (為了區分權重和回歸係數,在這裡用θ表示回歸係數,w表示權重), 那麼平方誤差的表達式就變成:

通過矩陣可以表示成:

f(θ)對θ求導等於0得到:

通過上面的公式,對於任意給定的未知數據可以計算出對應的回歸係數θθ,並得到相應的預測值y, 其中W是一個對角矩陣,對角線上的元素wii對應樣本點xi的權重值。

使用高斯核來賦值權重

那麼權重的表達式又是怎樣的呢,我們需要距離給定x的樣本點的權重越高,LWRL使用核來對附近的點賦予更高的權重,最常用的是高斯核函數,對應表達式如下:

通過公式可以看到如果xi距離xx的距離越小,wii就會越大,其中參數k決定了權重的大小。k越大權重的差距就越小,k越小權重的差距就很大,僅有局部的點參與進回歸係數的求取,其他距離較遠的權重都趨近於零。如果k去進入無窮大,所有的權重都趨近於1,W也就近似等於單位矩陣,局部加權線性回歸變成標準的無偏差線性回歸,會造成欠擬合的現象;當k很小的時候,距離較遠的樣本點無法參與回歸參數的求取,會造成過擬合的現象。

LWLR的Python實現

本部分對局部加權線性回歸進行Python實現,對於給定數據求取相應回歸係數:

deflwlr(x,X,Y,k):

""" 局部加權線性回歸,給定一個點,獲取相應權重矩陣並返回回歸係數

"""

m=X.shape[0]

# 創建針對x的權重矩陣

W=np.matrix(np.zeros((m,m)))

foriinrange(m):

xi=np.array(X[i][0])

x=np.array(x)

W[i,i]=exp((np.linalg.norm(x-xi))/(-2*k**2))

# 獲取此點相應的回歸係數

xWx=X.T*W*X

ifnp.linalg.det(xWx)==0:

print("xWx is a singular matrix")

return

w=xWx.I*X.T*W*Y

returnw

我們對上部分使用的數據進行回歸併繪製回歸曲線:

當k = 0.5, 基本上就是無偏差的標準線性回歸

Correlation coefficient: 0.9869292425124014

當k = 0.1, 可以較好的反應數據的潛在規律

Correlation coefficient: 0.997890402610583

當k = 0.03, 擬合的曲線較多的考慮了雜訊數據導致過擬合的現象

Correlation coefficient: 0.9995975498285312

總結

本文總結了標準線性回歸以及局部加權線性回歸的基礎知識,並對兩張回歸方式給與了Python的實現。可見局部加權線性回歸在取得適當的k,便可以較好的發現數據的內在潛質,但是局部加權線性回歸有個缺點就是類似kNN一樣,每計算一個點的預測值就需要利用所有數據樣本進行計算,如果數據量很大,計算量會是一個問題。

參考

  • 《Machine Learning in Action》

  • 如何通俗易懂地解釋「協方差」與「相關係數」的概念?

  • 看完本文有收穫?請轉發分享給更多人

    關注「大數據與機器學習文摘」,成為Top 1%

    推薦閱讀:

    Excel數組公式及運用快速學習
    無量壽經科注第四回學習班  (第一二八集)
    美媒:胎兒在母體子宮內便開始學習語言
    為什麼你寧願吃生活的苦,也不願吃學習的苦?
    植物也可以思考、感受和學習

    TAG:線性回歸 | 學習 | 機器學習 | 演算法 | 標準 | 實踐 | 回歸 | 機器 | 算法 |