機器學習 -- 支持向量機SVM

1. 背景

  1. 最先是由Corinna Cortes和Vapnik等於1995年首先提出的
  2. 深度學習(2012)出現以前,SVM被認爲是機器學習中近十幾年來最成功,表現最好的算法

2. 機器學習的通常框架

訓練集 => 提取特徵向量 => 結合必定的算法(分類器:好比決策樹,KNN) => 得出結果算法

3. 簡單介紹

3.1 例子

圖中有黑色和白色兩類色點,很明顯H1不能分開兩類點,H2勉強能夠,可是H3效果是最好的。margin越大,產生偏差的可能性越小。框架

3.2 SVM的主要內容

SVM尋找區分兩類的超平面(hyper plane),使邊際(margin)最大,當一個新的n維點輸入時根據其在超平面的哪一側將其歸爲那一類。機器學習

下面介紹邊際的概念:學習

Q1:總共能夠有多少個可能的超平面?
A1:無數條測試

Q2:如何選取使邊際(margin)最大的超平面(Max Margin Hyperplane)?
A2:超平面到一側最近點的距離等於到另外一側最近點的距離,兩側的兩個超平面平行。優化

Q3:爲何要選擇邊際最大的超平面呢
A3:是爲了新的測試點輸入時能夠根據在超平面的哪一側更精確地判斷測試點是屬於哪一類樣例。spa

 

3. 線性可區分(linear separable)和線性不可區分(linear inseparable)

 

前面幾張圖的例子都是比較完美的例子,能夠用一條直線來將兩類樣例分開,稱爲線性可區分,而如圖的狀況下就沒辦法直接用一條直接將兩類樣例分開,稱爲線性不可區分。後者更復雜,因此這裏咱們先討論線性可區分的狀況。.net

4. 定義與公式創建

超平面能夠定義爲(中間那條線):W*X + b = 0orm

這裏W是N維的權重,W={w1,w2,.....wn}
n是特徵值得個數
X是N維的訓練樣例,例如一個樣本點的座標是(3,8),則xT=(3,8) ,而不是x=3(通常說向量都是說列向量,所以以行向量形式來表示時,就加上轉置)。
b是偏向biasblog

就比如二維直線的方程式y=kx+吧,這裏只是擴展到N維,點的座標是(X1,X2,X3,...,Xn),W就比如擴展到N維的斜率k。

4.1 超平面方程

假設二維特徵向量:X=(x1,x2),把b想象爲額外的wight(w0),超平面方程爲:

W*X + b = 0   =>  向量W*向量X +w0=0  =>  (w1,w2)*(x1,x2) + w0 = 0  =>  w1*x1 + w2*x2 + w0 = 0

全部超平面右上方的點知足:w1*x1 + w2*x2 + w0 > 0

全部超平面左上方的點知足:w1*x1 + w2*x2 + w0 < 0

將兩類樣例的分類標記classlabel分別用值+1和-1,字母y表示,超平面兩邊邊際的兩個平行的超平面用H1和H2表示,令兩側邊際線上的點代入結果=1和-1,則H1,H2外側:
                      H1:W1*X1 + W2*X2 + b >= 1, y=+1
                      H2:W1*X1 + W2*X2 + b <= -1, y=-1
綜合以上兩式,獲得公式(1):
                      y*(W1*X1 + W2*X2 + b) >= 1 
也就是說全部訓練集的點都知足這個公式

全部坐落在邊際的兩邊的超平面上的被稱做"支持向量(support vectors)",分界的超平面和H1,H2上任意一點的距離=1/(||W||),||W||是向量的範數, (i.e:其中||W||是向量的範數(norm))。

因此,最大邊際距離爲:2/(||W||)

5. 求解

5.1 SVM如何找出最大邊際的超平面呢(MMH)

利用一些數學推導,以上公式(1)可變爲有限制的凸優化問題(convex quadratic optimization);
利用karush-Kuhn-Tucker(KKT)條件和拉格朗日公式,能夠推出MMH能夠被表示爲如下"決定邊界":

其中,yi是支持向量點Xi(support vector)的類別標記(class label),XT是要測試的實例,阿爾法i和b0是剛纔一系列計算中獲得的具體值,l是支持向量點的個數。

5.2 對於任何測試(要歸類的)實例,代入以上公式,得出的符號是正仍是負決定

6. 例子

 

如圖,已知訓練集(2,3),(1,1),(2,0)這三個點,(2,3)是第一類,(1,1),(2,0)是第二類,怎樣進行SVM計算呢。

首先能夠看出支持向量是(2,3)和(1,1),向量W =(2,3)-(1,1) = (a,2a)

根據公式兩側邊際線上的點W1*X1 + W2*X2 + b = 1和-1,能夠列出:

2*a + 3*2a + b =1
1*a + 1*2a + b = -1
解得 a=0.4,b=-2.2


向量W = (0.4,0.8)
g(向量x) = 0.4 * X1 + 0.8 * X2 - 2.2

經過這個方程就能夠對平面中的點進行判斷,凡是第一類的點也就是是分界線上方的點座標代入,結果必然大於0,第二類的點代入結果必然小於0,這樣也就創建了SVM的方程。

另外咱們能夠看出SVM能夠解決兩類實例的分類問題,但通常問題中,樣例的類別每每不止兩類,這時候SVM是怎麼處理的呢?好比有10類的樣例,怎麼進行分類判斷?只須要創建10個SVM方程就能獲得結果。好比第一個是類別1,第二個是類別2到10的集合,這樣就能創建一個SVM方程;第一個是類別2,第二個是類別1和類別3到10的集合,這樣就能創建第二個SVM方程,以此類推。

最後總結一下SVM的特色:

  1. 訓練好的模型的算法複雜度是由支持向量的個數決定的而不是由數據的維度決定的,因此SVM不太容易產生overfitting。
  2. SVM訓練出的模型徹底依賴於支持向量,即便訓練集裏全部非支持向量所有除去,訓練出的模型也徹底同樣。
  3. 一個SVM若是訓練得出的支持向量個數較少,SVM訓練出的模型比較容易被泛化。能夠適用於個多的例子,而若是支持向量過多,那麼可能針對這個例子區分得比較好,可是其餘狀況區分得並非很好。

 

參考:http://blog.csdn.net/ewfwewef/article/details/52824711

相關文章
相關標籤/搜索