機器學習演算法實踐-標準與局部加權線性回歸
前言
最近開始總結學習回歸相關的東東了,與分類的目標變數是標稱型不同,回歸是對連續型數據進預測。當然還是從最簡單的線性回歸開始,本文主要介紹無偏差的標準線性回歸和有偏局部加權線性回歸的理論基礎以及相應的Python實現。
標準線性回歸
標準線性回歸的理論知識很簡單,我們既可以寫出它的標量表達式也可以寫成矩陣的形式,其中矩陣的形式也可以通過投影矩陣進行推到得到。本部分就對標準線性回歸的表達式進行下簡單的推導。
給定一組數據其中包括特徵矩陣 , 目標變數向量 :
其中 第一列為截距項,我們做線性回歸是為了得到一個最優回歸係數向量 使得當我們給定一個 能夠通過 預測 的值。其中 .
最小二乘法獲取回歸係數
那麼怎樣的 才是最優的呢?在標準線性回歸中我們需要找到是誤差最小的 , 即預測的 值與真實的 值之間的差值,為了避免簡單累加造成的正負差值相互抵消,這裡採用了平方誤差:
對於上述式子 可以通過梯度下降等方法得到最優解。但是使用矩陣表示將會是的求解和程序更為簡單:
將 對 求導可得:
使其等於0,便可得到:
通過投影矩陣獲取回歸係數
除了通過最小平方差的方法推導得到 的表達式,我們還可以通過投影矩陣(Projection Matrix)來得到。
我們知道如果我們能夠求得一個 使得 肯定是最好的,但是實際情況中 一般並不在矩陣 的列空間中,也就是此方程無解,於是我們希望通過將向量 投影到 的列空間中得到投影矩陣 , 然後求解 來獲取一個最接近的一個解, 矩陣 的投影矩陣形式為
於是得到 在 列空間的投影為
此時方程 是有解的,得到最接近 的解為:
標準線性回歸的Python實現
通過矩陣形式我么可以很方便的通過Numpy的介面進行矩陣運算獲取線性回歸係數向量 , 實現如下:
def std_linreg(X, Y):n xTx = X.T*Xn if np.linalg.det(xTx) == 0:n print(xTx is a singular matrix)n returnn return xTx.I*X.T*Yn
通過對現有數據進行標準線性回歸併繪製回歸直線得到如下圖(完整代碼和數據見: https://github.com/PytLab/MLBox/tree/master/linear_regression)
w = [3.00774324, 1.69532264]n
相關係數(Correlation Coefficient)計算
如何判斷獲得的模型預測能力的好壞呢?我們需要計算模型計算得到的 的值向量與實際 值向量的匹配程度, 也就是計算相關係數Correlation Coefficient。
相關係數的計算公式:
也就是兩個數據序列的協方差併除上各自的標準差,本質上就是一種剔除了兩個變數量綱影響、標準化後的特殊協方差。
而協方差便是衡量兩個變數變化趨勢是否相似的一種方法,是同向變化(同時變大或變小)還是反向變化(一個變大一個變小), 同向或者反向的程度如何,計算公式如下:
通過公式可以看出,如果對於向量中的每個 同時大於或同時小於各自的期望值,協方差為正,相反則為負。可見如果協方差越大相似程度就越高,協方差越小相似程度就越小。也可以看到如果 相同,協方差就是方差,也就是方差是一種特殊情況下的協方差。
關於協方差與相關係數的通俗解釋可以參考知乎上的回答:如何通俗易懂地解釋「協方差」與「相關係數」的概念?
雖然Numpy中有計算協方差的介面numpy.corrcoef,是分別對兩兩向量進行比較並計算協方差,得到協方差矩陣。為了練習,我還是稍微自己計算了下協方差並只計算兩列不同數據之間的相關係數:
def get_corrcoef(X, Y):n # X Y 的協方差n cov = np.mean(X*Y) - np.mean(X)*np.mean(Y)n return cov/(np.var(X)*np.var(Y))**0.5n
通過對上面得到的線性回歸模型得到的預測的值與實際的值進行相關係數計算可以得到相關係數為
Correlation coefficient: 0.9864735622335125n
局部加權線性回歸(Local Weighted Linear Regression)
上面的數據點是通過公式 添加雜訊生成的數據,而標準的線性回歸是一種無偏差估計,在計算所有點的時候都是無偏差的計算誤差並通過優化方法優化誤差,如果針對不同的點能夠對誤差進行調整便可以一定程度上避免標準線性回歸帶來的欠擬合現象。
也就是引入偏差來降低預測的均方誤差,本部分總結下局部加權線性回歸的方法。當我們獲取某個 的預測值的時候,我們需要計算回歸係數 ,但是如果針對樣本中的數據,距離 越近我們就給個越大的權重,如果距離越遠就給一個小的權重,這樣就會使得針對 的預測值 能夠更貼合樣本數據。
當我們需要對數據點 相應的目標值進行預測的時候,我們需要給樣本中的每個點賦予一個權重值 (為了區分權重和回歸係數,在這裡用 表示回歸係數, 表示權重), 那麼平方誤差的表達式就變成:
通過矩陣可以表示成:
對 求導等於0得到:
通過上面的公式,對於任意給定的未知數據可以計算出對應的回歸係數 ,並得到相應的預測值 , 其中 是一個對角矩陣,對角線上的元素 對應樣本點 的權重值。
使用高斯核來賦值權重
那麼權重的表達式又是怎樣的呢,我們需要距離給定 的樣本點的權重越高,LWRL使用核來對附近的點賦予更高的權重,最常用的是高斯核函數,對應表達式如下:
通過公式可以看到如果 距離xx的距離越小, 就會越大,其中參數 決定了權重的大小。 越大權重的差距就越小, 越小權重的差距就很大,僅有局部的點參與進回歸係數的求取,其他距離較遠的權重都趨近於零。如果 去進入無窮大,所有的權重都趨近於1, 也就近似等於單位矩陣,局部加權線性回歸變成標準的無偏差線性回歸,會造成欠擬合的現象;當k很小的時候,距離較遠的樣本點無法參與回歸參數的求取,會造成過擬合的現象。
LWLR的Python實現
本部分對局部加權線性回歸進行Python實現,對於給定數據求取相應回歸係數:
def lwlr(x, X, Y, k):n 局部加權線性回歸,給定一個點,獲取相應權重矩陣並返回回歸係數n n m = X.shape[0]n # 創建針對x的權重矩陣n W = np.matrix(np.zeros((m, m)))n for i in range(m):n xi = np.array(X[i][0])n x = np.array(x)n W[i, i] = exp((np.linalg.norm(x - xi))/(-2*k**2))n # 獲取此點相應的回歸係數n xWx = X.T*W*Xn if np.linalg.det(xWx) == 0:n print(xWx is a singular matrix)n returnn w = xWx.I*X.T*W*Yn return wn
我們對上部分使用的數據進行回歸併繪製回歸曲線:
1) 當k = 0.5, 基本上就是無偏差的標準線性回歸
Correlation coefficient: 0.9869292425124014n
2) 當k = 0.1, 可以較好的反應數據的潛在規律
Correlation coefficient: 0.997890402610583n
3) 當k = 0.03, 擬合的曲線較多的考慮了雜訊數據導致過擬合的現象
總結
本文總結了標準線性回歸以及局部加權線性回歸的基礎知識,並對兩張回歸方式給與了Python的實現。可見局部加權線性回歸在取得適當的 ,便可以較好的發現數據的內在潛質,但是局部加權線性回歸有個缺點就是類似kNN一樣,每計算一個點的預測值就需要利用所有數據樣本進行計算,如果數據量很大,計算量會是一個問題。
參考
- 《Machine Learning in Action》
- 如何通俗易懂地解釋「協方差」與「相關係數」的概念?
推薦閱讀:
※Coursera吳恩達《構建機器學習項目》課程筆記(1)-- 機器學習策略(上)
※自然語言處理工具:中文 word2vec 開源項目,教程,數據集
※基於logistic回歸模型的風格輪動預測
※[note]Learning from Simulated and Unsupervised Images through Adversarial Training