Python3機器學習實踐:支援向量機理論與例項

1.png
支援向量機屬於監督式學習的方法,可實現分類以及迴歸。它是 Corinna Cortes 和 Vapnik 等於1995年首先提出的。演算法優點在於具有完整的理論支援,可以得到全域性最優解,並且可以解決非線性問題。缺點在於不適用於樣本數較大的情況,另外針對非線性問題時核函式的選擇,沒有特別的依據。

image
分類--引入

image
如上圖,平面內展示了二維資料樣本,其中“+”號表示正例,“-”號表示負例。存在無數條分割線可以分開上述兩類樣本(見下圖,圖中僅列出了4條分割線)。

image
所有分割線中,只存在一條最優的: 分割線到負例的距離中最小的那個距離,要等於到正例的距離中最小的距離,並且這兩個距離的和是所有滿足前一個條件的分割線中最大的 (見下圖左)。

image
下面定義一個向量 W ,現在只定義它的方向,就是與分割線垂直。假設這個樣本空間中存在一個樣本向量 U , PP=U·W 可看作向量 U 在 W 上的投影(因為 W 未定義長度)。現在規定:如果 U 是一個負例,則 PP 的值越小越好;如果是一個正例,則 PP 的值越大越好(見上圖右)。
因此在判斷樣本屬於正例還是負例時,就是判斷 PP 的值是否大於一個數,也就是判斷 U·W+b>=0 。為了求得 W 和 b ,需要新增一些約束條件。不失一般性,對於一個正例 Xz ,可以令 Xz·W+b>=1 , 對於一個負例 Xf ,可以令 Xf·W+b<=-1 。數學便利性:對於正例,令 Y= 1 ,對於負例,令 Y=-1 。因此結合以上式子可得:對於任意的樣本 h ,有 Yh(Xh·W+b) >=1 ,也就是 Yh(Xh·W+b)-1>=0 。
現在著重研究下 Yh(Xh·W+b)-1=0 的情況,當樣本 h 在上邊緣或者在下邊緣時,式子成立。假設正例 Xz ,負例 Xf 分別在上邊緣、下邊緣上。則上邊緣與下邊緣的距離,也就是分割線的最大間隔為:

image
因為 Yz=1,Xz·W = 1-b, Yf=-1,Xf·W = -1-b , 所以 g=2/||W|| 。

image
OK,整理下思路。要獲得 g 的最大值,

image

image
分類--推導
- 線性可分情況:硬間隔
問題的表示式如下:

image

image
因為上面的約束條件包含不等式約束,因此需要利用 KKT(Karush-Kuhn-Tucker) 條件求解(只有等式約束,才可利用拉格朗日乘子法求解)。將原始問題轉為下面形式的對偶問題(在滿足KKT條件時,求取對偶問題最大值的最優解就是原始問題取得最小值的最優解,理論參見《凸優化》):

image
KKT條件是保證取得的解是最優解的必要條件,而對於像本問題這樣的凸優化問題,則是充要條件,下面給出KKT條件:

image

image
- 線性可分情況:軟間隔
上面描述的是線性可分的情形,也就是存線上或者面可以將樣本按類別很好的分開。現在看下面存在離群點的2種情況:

image
情況A:如果依然按著硬間隔進行劃分,泛化能力會減弱;
情況B:不存在硬間隔。因此在這種情形下,要適當的對約束條件進行如下的放寬。

image
對於硬間隔而言, Yh(Xh·W+b) >=0 對任何的樣本均成立,也就是保證所有的樣本均分類正確。而在軟間隔中, Yh(Xh·W+b) >=0 不是對所有的樣本均成立,也就是允許對一些離散的點分類錯誤。
因為不能無限放寬,因此需要在目標函式裡面增加一個懲罰項,問題變為:

image
上式中 C 的值越大,離群點的存在會使得目標函式的值變大,為了降低目標函式的值,這時候,得到的結果便趨向於硬間隔。經過和硬間隔同樣的變化,得到軟間隔的對偶問題:

image
模型多了 αi<=C 的限制條件,並且表示式中並沒有引數 ξi ,此時b的求值公式也會發生相應的改變。下面給出KKT條件:

image
- 線性不可分情況:核函式
以上描述的都是線性可分的情形,現在考慮下面的情形(下圖左):

image
首先上述不存在硬間隔,如果使用軟間隔,則和資料分佈不符,因此需要對原始的資料進行非線性轉換(上圖右)。前面線性可分的2種情況的最終對偶問題表示式中,都只是和內積有關。因此只要找到一個函式 F ,使得

image
其中P是非線性轉換函式。也就是說F的值恰好是非線性轉換後的向量的內積,此時的F稱為核函式。
下面介紹幾種常用的核函式:

image
經過核函式的對偶問題為:

image

image
分類--結果展示
- AnFany

image

image
- Sklearn

image

image
迴歸

image

image

image

image
SVM求解
- 基於SMO演算法求解
1996年, Platt 釋出了SMO演算法。SMO演算法是將大優化問題分解為多個小優化問題來求解。這點和座標上升/下降法類似。SMO演算法的工作原理:每次迴圈選擇2個變數進行優化處理,一旦找到一對符合條件的變數,那麼就增大其中一個通式減小另一個。符合的條件一是這2個變數必須在間隔邊界之外,二是這2個變數還沒有進行過區間化處理或者不在邊界上。SMO演算法的原理類似於座標上升/下降演算法。點選閱讀原文,可獲得分類、迴歸的SMO偽碼以及座標上升/下降演算法的詳細程式碼。
- 基於梯度下降的求解

image

image

image
例項程式碼: Python3/tree/master/SVM/SVM_Regression" target="_blank" rel="nofollow,noindex">迴歸 , 分類 ,掃描下方二維碼或者微信公眾號直接搜尋” Python範兒 “,關注微信公眾號pythonfan, 獲取更多例項和程式碼。

pythonfan.jpg