來自http://blog.csdn.net/sealyao/article/details/6442403的轉載
鏈接裏面的博主已經寫的很清晰明瞭容易理解,鑑於自己對於svm的數學推理覺得比較複雜,一直覺得比較難,但是看過這文章之後,有一種柳暗花明又一村的感覺,所以轉載作爲收藏保存了。在此表示非常的感謝!
支持向量機(Support Vector Machine)是Cortes和Vapnik於1995年首先提出的,它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函數擬合等其他機器學習問題中。
一、數學部分
1.1二維空間
支持向量機的典型應用是分類,用於解決這樣的問題:有一些事物是可以被分類的,但是具體怎麼分類的我們又說不清楚,比如說下圖中三角的就是C1類,圓圈的就是C2類,這都是已知的,好,又來了一個方塊,這個方塊是屬於C1呢還是屬於C2呢,說不清楚。SVM算法就是試着幫您把這件事情說清楚的。
在二維空間裏(這時候樣本有兩個參照屬性),SVM就是在C1和C2中間劃一條線g(x)=0,線兒上邊的屬於C1類,線兒下邊的屬於C2類,這時候方塊再來,咱就有章程了。
關於g(x) = 0得再囉嗦幾句,g(x)裏邊的x不是橫座標,而是一個向量,也不是解析幾何裏邊的斜率,也是向量。是一個向量積。比如在解析幾何意義上的直線y = -x-b,換成向量表示法就是 ,這裏w就是那個,x就是那個。
對C1類中的點:g(x) > 0;對於 C2類中的點:g(x) < 0 ;
如果我們用y來表示類型,+1代表C1類,-1代表C2類。
那麼對於所有訓練樣本而言,都有:,那麼g(x) = 0 就能夠正確分割所有訓練樣本的那條線,只要把g(x) = 0這條線給找出來就能湊合用了。
這也就只能湊合用,因爲滿足這個條件的g(x) = 0 太多了,追求完美的我們要的是最優的那條線。怎麼纔是最優的呢?直覺告訴我們g(x) = 0這條線不偏向C1那邊,也不偏向C2那邊,就應該是最優的了吧。對,學名叫分類間隔,下圖紅線的長度就是分類間隔。
在二維空間中,求分類間隔,可以轉化爲求點到線的距離,點到線的距離可以表示爲(向量表示)。爲簡單計,把整個二維空間歸一化(等比放大或縮小),使得對於所有的樣本,都有|g(x)|>=1,也就是讓C1和C2類中離g(x)=0最近的訓練樣本的|g(x)|=1,這時分類間隔就是,這個間隔越大越好,那麼||越小越好。
1.2多維空間
現在我們已經在2維空間中抽象出一個數學問題,求滿足如下條件的g(x)=0:
,即在滿足條件下能使取最小值的那個w。在二維空間中,w可以近似的理解爲斜率,在樣本確定,斜率確定的情況下,中的那個b也是可以確定的,整個 = 0也就確定了。
現在我們討論的只是二維空間,但是我們驚喜的發現,在二維空間中的結論可以很容易的推廣到多維空間。比如說:
多維空間中點到面的距離仍然可以表示爲。如下圖,平面表示爲,x是在面上的投影,r是x到面的距離,簡單推導如下:
w向量垂直於平面,有:,把上式帶入中得到,化簡得到,所以,向量x到平面的距離,這和二維空間中結論也是一致的。
現在我們把SVM從2維空間推廣到多維空間,即求滿足如下條件的g(x)=0:
1.3拉格朗日因子
這是一個典型的帶約束條件的求極值問題,目標函數是的二次函數,約束函數是的線性函數:二次規劃問題。求解二次規劃問題的一般性方法就是添加拉格朗日乘子,構造拉格朗日函數(理論上這兒應該還有一些額外的數學條件,拉格朗日法纔是可用,就略過了)。
具體求解步驟如下:
1、構造拉格朗日函數
3、把上式帶回拉格朗日函數,得到拉格朗日對偶問題,把問題轉化爲求解
1.4線性化
好,現在我們再來梳理一下svm的分類邏輯,在空間中找一個分割面(線)把樣本點分開,分割面(線)的最優條件就是分類間隔最大化,分類間隔是基於點到平面(直線)的距離來計算的。問題是所有的分割面都是平面,所有的分割線都是直線嗎?顯然不是。
比如特徵是房子的面積x,這裏的x是實數,結果y是房子的價格。假設我們從樣本點的分佈中看到x和y符合3次曲線,那麼我們希望使用x的三次多項式來逼近這些樣本點。
在二維空間中這是非線性的,這樣我們前面的推理都沒法用了------點到曲線的距離?不知道怎麼算。但是如果把x映射到3維空間,那麼對於來說,就是線性的,也就是說,對於低維空間中非線性的線(面),在映射到高維空間中時,就能變成線性的。於是我們還需要把問題做一個小小的修正,我們面臨的問題是求解:
,這裏面引入了一個Kernel,核函數,用於樣本空間的線性化。
1.5鬆弛變量
上面就是一個比較完整的推導過程,但是經驗表明把上述條件丟給計算機進行求解,基本上是無解的,因爲條件太苛刻了。實際上,最經常出現的情況如下圖紅色部分,在分類過程中會出現噪聲,如果對噪聲零容忍那麼很有可能導致分類無解。
爲了解決這個問題又引入了鬆弛變量。把原始問題修正爲:
按照拉格朗日法引入拉格朗日因子:
另外當目標函數取極值時,約束條件一定是位於約束邊界(KKT條件),也就是說:
分析上面式子可以得出以下結論:
再用數學語言提煉一下:
KKT條件可以表示爲:
所有的 大於所有的。這裏b作爲中間數被忽略了,因爲b是可以由推導得到的。
二、算法部分
對於樣本數量比較多的時候(幾千個),SVM所需要的內存是計算機所不能承受的。目前,對於這個問題的解決方法主要有兩種:塊算法和分解算法。這裏,libSVM採用的是分解算法中的SMO(串行最小化)方法,其每次訓練都只選擇兩個樣本。基本流程如下:
外層循環:優先選擇遍歷非邊界樣本,因爲非邊界樣本更有可能需要調整,而邊界樣本常常不能得到進一步調整而留在邊界上。在遍歷過程中找出的所有樣本中值最大的那個(這個樣本是最有可能不滿足條件的樣本。
內層循環:對於外層循環中選定的那個樣本,找到這樣的樣本,使得:
最大,上式是更新中的一個算式,表示的是在選定,最爲更新算子的情況下,最大。
由於SMO每次都只選擇2個樣本,那麼等式約束可以轉化爲直線約束:
轉化爲圖形表示爲:
最終:
2.3其他
上面說到SVM用到的內存巨大,另一個缺陷就是計算速度,因爲數據大了,計算量也就大,很顯然計算速度就會下降。因此,一個好的方式就是在計算過程中逐步去掉不參與計算的數據。因爲,實踐證明,在訓練過程中,一旦達到邊界(=0或者=C),的值就不會變,隨着訓練的進行,參與運算的樣本會越來越少,SVM最終結果的支持向量(0<
LibSVM採用的策略是在計算過程中,檢測active_size中的值,如果到了邊界,那麼就應該把相應的樣本去掉(變成inactived),並放到棧的尾部,從而逐步縮小active_size的大小。
理論上,b的值是不定的。當程序達到最優後,只要用任意一個標準支持向量機(0<<C)的樣本帶入上式,得到的b值都是可以的。目前,求b的方法也有很多種。在libSVM中,分別對y=+1和y=-1的兩類所有支持向量求b,然後取平均值。
- 頂
- 0
- 踩