svm的數學推導原理

來自http://blog.csdn.net/sealyao/article/details/6442403的轉載

鏈接裏面的博主已經寫的很清晰明瞭容易理解,鑑於自己對於svm的數學推理覺得比較複雜,一直覺得比較難,但是看過這文章之後,有一種柳暗花明又一村的感覺,所以轉載作爲收藏保存了。在此表示非常的感謝!


支持向量機(Support Vector Machine)是Cortes和Vapnik於1995年首先提出的,它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函數擬合等其他機器學習問題中。

一、數學部分

1.1二維空間

支持向量機的典型應用是分類,用於解決這樣的問題:有一些事物是可以被分類的,但是具體怎麼分類的我們又說不清楚,比如說下圖中三角的就是C1類,圓圈的就是C2類,這都是已知的,好,又來了一個方塊,這個方塊是屬於C1呢還是屬於C2呢,說不清楚。SVM算法就是試着幫您把這件事情說清楚的。

1在二維空間裏(這時候樣本有兩個參照屬性),SVM就是在C1和C2中間劃一條線g(x)=0,線兒上邊的屬於C1類,線兒下邊的屬於C2類,這時候方塊再來,咱就有章程了。

2     

關於g(x) = 0得再囉嗦幾句,g(x)裏邊的x不是橫座標,而是一個向量,clip_image002[4]也不是解析幾何裏邊的斜率,也是向量。clip_image004是一個向量積。比如在解析幾何意義上的直線y = -x-b,換成向量表示法就是clip_image002[12] ,這裏w就是那個clip_image008,x就是那個clip_image010

對C1類中的點:g(x) > 0;對於 C2類中的點:g(x) < 0 ;

如果我們用y來表示類型,+1代表C1類,-1代表C2類。

那麼對於所有訓練樣本而言,都有:clip_image012,那麼g(x) = 0 就能夠正確分割所有訓練樣本的那條線,只要把g(x) = 0這條線給找出來就能湊合用了。

這也就只能湊合用,因爲滿足這個條件的g(x) = 0 太多了,追求完美的我們要的是最優的那條線。怎麼纔是最優的呢?直覺告訴我們g(x) = 0這條線不偏向C1那邊,也不偏向C2那邊,就應該是最優的了吧。對,學名叫分類間隔,下圖紅線的長度就是分類間隔。

3

在二維空間中,求分類間隔,可以轉化爲求點到線的距離,點到線的距離可以表示爲clip_image002[6](向量表示)。爲簡單計,把整個二維空間歸一化(等比放大或縮小),使得對於所有的樣本,都有|g(x)|>=1,也就是讓C1和C2類中離g(x)=0最近的訓練樣本的|g(x)|=1,這時分類間隔就是clip_image004[4],這個間隔越大越好,那麼|clip_image006[8]|越小越好。

1.2多維空間

現在我們已經在2維空間中抽象出一個數學問題,求滿足如下條件的g(x)=0:

clip_image008[4],即在滿足clip_image010[4]條件下能使clip_image012[4]取最小值的那個w。在二維空間中,w可以近似的理解爲斜率,在樣本確定,斜率確定的情況下,clip_image014中的那個b也是可以確定的,整個clip_image016 = 0也就確定了。

現在我們討論的只是二維空間,但是我們驚喜的發現,在二維空間中的結論可以很容易的推廣到多維空間。比如說:

我們仍然可以把多維空間中的分割面(超平面)表示爲clip_image018

多維空間中點到面的距離仍然可以表示爲clip_image002[7]。如下圖,平面表示爲clip_image018[1],x是clip_image020在面上的投影,r是x到面的距離,簡單推導如下:

w向量垂直於平面clip_image022,有:clip_image024,把上式帶入clip_image018[2]中得到clip_image026,化簡得到clip_image028,所以clip_image030,向量x到平面clip_image018[3]的距離clip_image032,這和二維空間中結論也是一致的。

clip_image034

現在我們把SVM從2維空間推廣到多維空間,即求滿足如下條件的g(x)=0:

clip_image036

1.3拉格朗日因子

這是一個典型的帶約束條件的求極值問題,目標函數是clip_image006[9]的二次函數,約束函數是clip_image006[10]的線性函數:二次規劃問題。求解二次規劃問題的一般性方法就是添加拉格朗日乘子,構造拉格朗日函數(理論上這兒應該還有一些額外的數學條件,拉格朗日法纔是可用,就略過了)。

具體求解步驟如下:

1、構造拉格朗日函數

         clip_image038

其中clip_image006[11]和b是未知量。

2、對clip_image006[12]和b求偏導數,令偏導數爲0。

clip_image040, 即clip_image042

clip_image044

3、把上式帶回拉格朗日函數,得到拉格朗日對偶問題,把問題轉化爲求解clip_image046

clip_image048

4、最後把問題轉化爲求解滿足下列等式的clip_image046[1]

clip_image050

1.4線性化

好,現在我們再來梳理一下svm的分類邏輯,在空間中找一個分割面(線)把樣本點分開,分割面(線)的最優條件就是分類間隔最大化,分類間隔是基於點到平面(直線)的距離來計算的。問題是所有的分割面都是平面,所有的分割線都是直線嗎?顯然不是。

比如特徵是房子的面積x,這裏的x是實數,結果y是房子的價格。假設我們從樣本點的分佈中看到x和y符合3次曲線,那麼我們希望使用x的三次多項式來逼近這些樣本點。

在二維空間中這是非線性的,這樣我們前面的推理都沒法用了------點到曲線的距離?不知道怎麼算。但是如果把x映射到3維空間clip_image052,那麼對於clip_image054來說,clip_image056就是線性的,也就是說,對於低維空間中非線性的線(面),在映射到高維空間中時,就能變成線性的。於是我們還需要把問題做一個小小的修正,我們面臨的問題是求解:

clip_image050[1],這裏面引入了一個Kernel,核函數,用於樣本空間的線性化。

1.5鬆弛變量

      上面就是一個比較完整的推導過程,但是經驗表明把上述條件丟給計算機進行求解,基本上是無解的,因爲條件太苛刻了。實際上,最經常出現的情況如下圖紅色部分,在分類過程中會出現噪聲,如果對噪聲零容忍那麼很有可能導致分類無解。

5      

爲了解決這個問題又引入了鬆弛變量。把原始問題修正爲:

clip_image002[10]

按照拉格朗日法引入拉格朗日因子:

clip_image004[6]

對上式分別求clip_image006[18]的導數得到:

clip_image008[6], 即clip_image010[6]

clip_image012[6]

clip_image014[4]

帶回clip_image016[4]得到拉格朗日的對偶問題:

clip_image018[10]

另外當目標函數取極值時,約束條件一定是位於約束邊界(KKT條件),也就是說:

clip_image020[4]

clip_image022[4]

分析上面式子可以得出以下結論:

clip_image024[4]時:clip_image026[4]可以不爲零,就是說該點到分割面的距離小於clip_image028[4],是誤分點。

clip_image030[4]時:clip_image026[5]爲零,clip_image032[4]大於零:表示該點到分割面的距離大於clip_image028[5]是正確分類點。

clip_image034時:clip_image026[6]爲零,clip_image036[4],該點就是支持向量。

再用數學語言提煉一下:

clip_image038[4],其對clip_image040[4]的偏導數爲:

clip_image042[4]

KKT條件可以表示爲:

clip_image044[4]

clip_image046[6]表示該KKT條件就是:

clip_image048[9]

clip_image050[6],則

所有的clip_image052[4] 大於所有的clip_image054[4]。這裏b作爲中間數被忽略了,因爲b是可以由clip_image056[4]推導得到的。

二、算法部分

對於樣本數量比較多的時候(幾千個),SVM所需要的內存是計算機所不能承受的。目前,對於這個問題的解決方法主要有兩種:塊算法和分解算法。這裏,libSVM採用的是分解算法中的SMO(串行最小化)方法,其每次訓練都只選擇兩個樣本。基本流程如下:

image

這裏有兩個重要的算法,一個是clip_image060的選擇,另一個是clip_image060[1]的更新。

2.1clip_image062的選擇算法

選擇兩個和KKT條件違背的最嚴重的兩個clip_image056[5],包含兩層循環:

外層循環:優先選擇遍歷非邊界樣本,因爲非邊界樣本更有可能需要調整,而邊界樣本常常不能得到進一步調整而留在邊界上。在遍歷過程中找出clip_image064的所有樣本中clip_image066值最大的那個(這個樣本是最有可能不滿足clip_image068條件的樣本。

內層循環:對於外層循環中選定的那個樣本clip_image056[6],找到這樣的樣本clip_image070,使得:

clip_image072

clip_image074最大,上式是更新clip_image060[2]中的一個算式,表示的是在選定clip_image056[7]clip_image070[1]最爲更新算子的情況下,clip_image076最大。

如果選擇clip_image060[3]的過程中發現KKT條件已經滿足了,那麼算法結束。

2.2clip_image062[1]的更新算法

由於SMO每次都只選擇2個樣本,那麼等式約束可以轉化爲直線約束:

clip_image078

轉化爲圖形表示爲:

clip_image079

那麼clip_image081的取值範圍是:

clip_image083

clip_image085帶入clip_image087中,得到一個一元二次方程,求極值得到:

clip_image089

最終:

clip_image091

2.3其他

上面說到SVM用到的內存巨大,另一個缺陷就是計算速度,因爲數據大了,計算量也就大,很顯然計算速度就會下降。因此,一個好的方式就是在計算過程中逐步去掉不參與計算的數據。因爲,實踐證明,在訓練過程中,clip_image095一旦達到邊界(clip_image095[1]=0或者clip_image095[2]=C),clip_image095[3]的值就不會變,隨着訓練的進行,參與運算的樣本會越來越少,SVM最終結果的支持向量(0<clip_image095[4]

LibSVM採用的策略是在計算過程中,檢測active_size中的clip_image095[5]值,如果clip_image095[6]到了邊界,那麼就應該把相應的樣本去掉(變成inactived),並放到棧的尾部,從而逐步縮小active_size的大小。

b的計算 ,基本計算公式爲:clip_image097

理論上,b的值是不定的。當程序達到最優後,只要用任意一個標準支持向量機(0<clip_image095[7]<C)的樣本帶入上式,得到的b值都是可以的。目前,求b的方法也有很多種。在libSVM中,分別對y=+1和y=-1的兩類所有支持向量求b,然後取平均值。

0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章