1. 程式人生 > >15-最小二乘法搞不定的,讓RANSAC來吧!

15-最小二乘法搞不定的,讓RANSAC來吧!

統計學 但是 rom 指定 車上 mat table oss div

現實生活總是充滿了雜音。記得高中時,班上某學霸喜歡戴著耳機邊聽JAY的歌邊學習,或許這樣可以幫他進入一個心如止水的境界。剛畢業那會,我也喜歡在班車上戴著耳機聽歌,似乎逃避現實是常態。把嘈雜的現實屏蔽在外很簡單,只需要一個耳機。但人總會成長的,面對紛繁復雜的現實,一味逃避總歸不是辦法。情緒的發泄也無益於問題的解決,只會讓現實更加千瘡百孔。更高級的智慧是冷靜下來,把復雜的問題分而治之,不斷叠代精進,從不理想的現實中提煉出最大的價值。正如,在線性回歸的世界裏,最小二乘法已經做得很好了,但是,面對可惡的噪音(outlier),依然無能為力。後來有了RANSAC(隨機抽樣一致)算法,它像靈巧的田螺姑娘一樣,挑挑揀揀,反復斟酌,竟從一團亂麻般的現實中找到了線索!它的抗幹擾能力,著實令人感動。如果擁有了RANSAC算法般的智慧,我猜,現實世界會變成problem solvers的遊樂場(●‘?‘●)??

代碼下載鏈接(需要拷貝到ipython notebook中運行):

https://pan.baidu.com/s/1kUIx6yN

4隨機抽樣一致算法(RANSAC)

隨機抽樣一致算法(RANdom SAmple Consensus,RANSAC)采用叠代的方式從一組包含離群點的被觀測數據中估算出數學模型的參數。

數據分兩種:有效數據(inliers)和無效數據(outliers)。偏差不大的數據稱為有效數據,偏差大的數據是無效數據。如果有效數據占大多數,無效數據只是少量時,我們可以通過最小二乘法或類似的方法來確定模型的參數和誤差;如果無效數據很多(比如超過了50%的數據都是無效數據),最小二乘法就失效了,我們需要新的算法。

RANSAC的大致算法如下:

1、在數據中隨機選擇幾個點設定為inliers

2、計算適合inliers的模型

3、把其他剛才沒有選到的點帶入剛才建立的模型中,計算是否為inliers(通常看殘差是否小於一個閾值)

4、記下inliers數量

5、重復以上步驟多次

6、比較哪次計算中inliers數量最多,那次所建的模型就是我們所要求的解。

例如上次的波士頓房價預測問題,我們用最小二乘法建立了房間數[RM] vs 房價[MEDV]的線性回歸模型,可以看出數據集中是有一些離群點的:

技術分享

如果用RANSAC算法再做一次,效果會不會更好呢?

下面RANSACRegressor算法類中的參數可參考:

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RANSACRegressor.html

技術分享

技術分享

技術分享

※RANSAC減少了 outlier 的影響,但對於未知數據的預測能力是否有影響未知。

5對比 RANSAC 回歸和 OLS 回歸

技術分享

技術分享

可以看出,RANSAC算法很好地抵抗了離群點的幹擾,求得的模型系數和真實模型系數十分接近。

6評估線性回歸模型的性能

用模型訓練過程中未出現過的數據集來測試模型,是客觀評價模型性能好壞的關鍵步驟。通常用sklearn中的cross_validation模塊,把原始數據集拆分為訓練集和測試集(可指定比例,通常70%用於訓練,30%用於測試):

技術分享

技術分享

如果預測都是正確的,那麽 residual 就是0。這是理想情況,實際中,我們希望 error 是圍繞著0隨機分布的。

從上圖看, 有部分 error 是離紅色線較遠的,可能是 outlier 引起較大的偏差。

技術分享

技術分享

今天我們學習了用RANSAC建立對outlier不敏感的線性回歸模型,以及如何評估線性回歸模型的性能,是否感覺技能樹又點亮了好多?一些統計學知識還是需要大家惡補下的,祝一切順利。下周學習如何把線性回歸模型轉變為曲線——即多項式回歸,敬請期待:)

15-最小二乘法搞不定的,讓RANSAC來吧!