一、引言
前面的文章介紹了很多分類算法,分類的目標變量是標稱型數據,而本節將會對連續型的數據做出預測。主要講解簡單的線性回歸和局部加權線性回歸。
二、什麼是回歸?
回歸的目的是預測數值型的目標值。他和我們之前做的分類是不一樣的。最直接的辦法是依據輸入寫出一個目標值的計算公式。假如你想預測小姐姐男友法拉利汽車的功率,可能會這麼計算:
HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio
寫成中文就是:
小姐姐男友法拉利汽車的功率 = 0.0015 * 小姐姐男友年薪 - 0.99 * 收聽公共廣播的時間
這就是所謂的回歸方程(regression equation),其中的0.0015和-0.99稱為回歸係數(regression weights),求這些回歸係數的過程就是回歸。一旦有了這些回歸係數,再給定輸入,做預測就非常容易了。具體的做法是用回歸係數乘以輸入值,再將結果全部加在一起,就得到了預測值。
說到回歸,一般都是指線性回歸(linear regression),所以本文裡的回歸和線性回歸代表同一個意思。線性回歸意味著可以將輸入項分別乘以一些常量,再將結果加起來得到輸出。需要說明的是,存在另一種成為非線性回歸的回歸模型,該模型不認同上面的做法,比如認為輸出可能是輸入的乘積。這樣,上面的功率計算公式也可以寫做:
HorsePower = 0.0015 * annualSalary / hoursListeningToPublicRadio
這就是一個非線性回歸的例子,這裡對此不做深入討論。
三、揭開回歸神奇的面紗~
1、用線性回歸找到最佳擬合直線
應該怎麼從一大堆數據裡求出回歸方程呢?假定輸入數據存放在矩陣X中,結果存放在向量y中:
而回歸係數存放在向量w中:
那麼對於給定的數據x1,即矩陣X的第一列數據,預測結果u1將會通過如下公式給出:
現在的問題是,手裡有數據矩陣X和對應的標籤向量y,怎麼才能找到w呢?一個常用的方法就是找出使誤差最小的w。這裡的誤差是指預測u值和真實y值之間的差值,使用該誤差的簡單累加將使得正差值和負差值相互抵消,所以我們採用平方誤差。
平方誤差和可以寫做:
用矩陣表示還可以寫做:
為啥能這麼變化,記住一個前提:若x為向量,則默認x為列向量,x^T為行向量。將上述提到的數據矩陣X和標籤向量y帶進去,就知道為何這麼變化了。
在繼續推導之前,我們要先明確一個目的:找到w,使平方誤差和最小。因為我們認為平方誤差和越小,說明線性回歸擬合效果越好。
現在,我們用矩陣表示的平方誤差和對w進行求導:
如果對於矩陣求不熟悉的,可以移步這裡:點擊查看
令上述公式等於0,得到:
w上方的小標記表示,這是當前可以估計出的w的最優解。從現有數據上估計出的w可能並不是數據中的真實w值,所以這裡使用了一個"帽"符號來表示它僅是w的一個最佳估計。
值得注意的是,上述公式中包含逆矩陣,也就是說,這個方程只在逆矩陣存在的時候使用,也即是這個矩陣是一個方陣,並且其行列式不為0。
述的最佳w求解是統計學中的常見問題,除了矩陣方法外還有很多其他方法可以解決。通過調用NumPy庫裡的矩陣方法,我們可以僅使用幾行代碼就完成所需功能。該方法也稱作OLS, 意思是「普通小二乘法」(ordinary least squares)。
數據格式為:
數據下載地址:數據集下載
第一列都為1.0,即x0。第二列為x1,即x軸數據。第三列為x2,即y軸數據。首先繪製下數據,看下數據分布。創建regression.py文件,編寫代碼如下:
運行代碼如下:
通過可視化數據,我們可以看到數據的分布情況。接下來,讓我們根據上文中推導的回歸係數計算方法,求出回歸係數向量,並根據回歸係數向量繪製回歸曲線,編寫代碼如下:
運行代碼如下:
如何判斷擬合曲線的擬合效果的如何呢?當然,我們可以根據自己的經驗進行觀察,除此之外,我們還可以使用corrcoef方法,來比較預測值和真實值的相關性。編寫代碼如下:
運行結果如下:
可以看到,對角線上的數據是1.0,因為yMat和自己的匹配是完美的,而YHat和yMat的相關係數為0.98。
最佳擬合直線方法將數據視為直線進行建模,具有十分不錯的表現。數據當中似乎還存在其他的潛在模式。那麼如何才能利用這些模式呢?我們可以根據數據來局部調整預測,下面就會介紹這種方法。
2、局部加權線性回歸
線性回歸的一個問題是有可能出現欠擬合現象,因為它求的是具有小均方誤差的無偏估計。而易見,如果模型欠擬合將不能取得好的預測效果。所以有些方法允許在估計中引入一 些偏差,從而降低預測的均方誤差。
其中的一個方法是局部加權線性回歸(Locally Weighted Linear Regression,LWLR)。在該方法中,我們給待預測點附近的每個點賦予一定的權重。與kNN一樣,這種算法每次預測均需要事先選取出對應的數據子集。該算法解除回歸係數W的形式如下:
其中W是一個矩陣,這個公式跟我們上面推導的公式的區別就在於W,它用來給每個點賦予權重。
LWLR使用"核"(與支持向量機中的核類似)來對附近的點賦予更高的權重。核的類型可以自由選擇,最常用的核就是高斯核,高斯核對應的權重如下:
這樣我們就可以根據上述公式,編寫局部加權線性回歸,我們通過改變k的值,可以調節回歸效果,編寫代碼如下:
運行結果如下:
可以看到,當k越小,擬合效果越好。但是當k過小,會出現過擬合的情況,例如k等於0.003的時候。
喜歡點下關注,你的關注是我寫作的最大支持