標籤:style http 使用 資料 os width
支援向量機(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也就確定了。
如今我們討論的僅僅是二維空間,可是我們驚喜的發現,在二維空間中的結論能夠非常easy的推廣到多維空間。比方說:
我們仍然能夠把多維空間中的切割面(超平面)表示為。
多維空間中點到面的距離仍然能夠表示為。例如以,平面表示為,x是在面上的投影,r是x到面的距離,簡單推導例如以下:
w向量垂直於平面,有:,把上式帶入中得到,化簡得到,所以,向量x到平面的距離,這和二維空間中結論也是一致的。
如今我們把SVM從2維空間推廣到多維空間,即求滿足例如以下條件的g(x)=0:
。
1.3拉格朗日因子
這是一個典型的帶約束條件的求極值問題,目標函數是的二次函數,約束函數是的線性函數:二次規劃問題。求解二次規劃問題的一般性方法就是加入拉格朗日乘子,構造拉格朗日函數(理論上這兒應該另一些額外的數學條件,拉格朗日法才是可用,就略過了)。
詳細求解過程例如以下:
1、構造拉格朗日函數
當中和b是未知量。
2、對和b求偏導數,令偏導數為0。
, 即
3、把上式帶回拉格朗日函數,得到拉格朗日對偶問題,把問題轉化為求解
4、最後把問題轉化為求解滿足下列等式的
1.4線性化
好,如今我們再來梳理一下svm的分類邏輯,在空間中找一個切割面(線)把樣本點分開,切割面(線)的最優條件就是分類間隔最大化,分類間隔是基於點到平面(直線)的距離來計算的。問題是全部的切割面都是平面,全部的切割線都是直線嗎?顯然不是。
比方特徵是房子的面積x,這裡的x是實數,結果y是房子的價格。如果我們從樣本點的分布中看到x和y符合3次曲線,那麼我們希望使用x的三次多項式來逼近這些樣本點。
在二維空間中這是非線性,這樣我們前面的推理都沒法用了------點到曲線的距離?不知道怎麼算。可是假設把x映射到3維空間,那麼對於來說,就是線性,也就是說,對於低維空間中非線性線(面),在映射到高維空間中時,就能變成線性。於是我們還須要把問題做一個小小的修正,我們面臨的問題是求解:
,這裡面引入了一個Kernel,核函數,用於樣本空間的線性化。
1.5鬆弛變數
上面就是一個比較完整的推導過程,可是經驗表明把上述條件丟給電腦進行求解,基本上是無解的,由於條件太苛刻了。實際上,最常常出現的情況例如以紅色部分,在分類過程中會出現雜訊,假設對雜訊零容忍那麼非常有可能導致分類無解。
為瞭解決問題又引入了鬆弛變數。把原始問題修正為:
依照拉格朗日法引入拉格朗日因子:
對上式分別求的導數得到:
, 即
帶回得到拉格朗日的對偶問題:
另外當目標函數取極值時,約束條件一定是位於約束邊界(KKT條件),也就是說:
分析上面式子能夠得出下面結論:
時:能夠不為零,就是說該點到切割面的距離小於,是誤分點。
時:為零,大於零:表示該點到切割面的距離大於是正確分類點。
時:為零,,該點就是支援向量。
再用數學語言提煉一下:
令,其對的偏導數為:
。
KKT條件能夠表示為:
用表示該KKT條件就是:
若,則
全部的 大於全部的。這裡b作為中間數被忽略了,由於b是能夠由推導得到的。
二、演算法部分
對於樣本數量比較多的時候(幾千個),SVM所須要的記憶體是電腦所不能承受的。眼下,對於這個問題的解決方案主要有兩種:塊演算法和分解演算法。這裡,libSVM採用的是分解演算法中的SMO(串列最小化)方法,其每次訓練都僅僅選擇兩個樣本。基本流程例如以下:
這裡有兩個重要的演算法,一個是的選擇,還有一個是的更新。
2.1的選擇演算法
選擇兩個和KKT條件違背的最嚴重的兩個,包括兩層迴圈:
外層迴圈:優先選擇遍曆非邊界樣本,由於非邊界樣本更有可能須要調整,而邊界樣本經常不能得到進一步調整而留在邊界上。在遍曆過程中找出的全部樣本中值最大的那個(這個樣本是最有可能不滿足條件的樣本。
內層迴圈:對於外層迴圈中選定的那個樣本,找到這種樣本,使得:
最大,上式是更新中的一個算式,表示的是在選定,最為更新運算元的情況下,最大。
假設選擇的過程中發現KKT條件已經滿足了,那麼演算法結束。
2.2的更新演算法
因為SMO每次都僅僅選擇2個樣本,那麼等式約束能夠轉化為直線約束:
轉化為圖形表示為:
那麼的取值範圍是:
把帶入中,得到一個一元二次方程,求極值得到:
終於:
2.3其它
上面說到SVM用到的記憶體巨大,還有一個缺陷就是計算速度,由於資料大了,計算量也就大,非常顯然計算速度就會下降。因此,一個好的方式就是在計算過程中逐步去掉不參與計算的資料。由於,實踐證明,在訓練過程中,一旦達到邊界(=0或者=C),的值就不會變,隨著訓練的進行,參與運算的樣本會越來越少,SVM終於結果的支援向量(0<
LibSVM採用的策略是在計算過程中,檢測active_size中的值,假設到了邊界,那麼就應該把對應的樣本去掉(變成inactived),並放到棧的尾部,從而逐步縮小active_size的大小。
b的計算 ,基本計算公式為:
理論上,b的值是不定的。當程式達到最優後,僅僅要用隨意一個標準支援向量機(0<<C)的樣本帶入上式,得到的b值都是能夠的。眼下,求b的方法也有非常多種。在libSVM中,分別對y=+1和y=-1的兩類全部支援向量求b,然後取平均值。