做者:July 。致謝:pluskid、白石、JerryLead。
說明:本文最初寫於2012年6月,然後不斷反反覆覆修改&優化,修改次數達上百次,最後修改於2016年11月。
聲明:本文於2012年便早已附上全部參考連接,並註明是篇「學習筆記」,且寫明具體參考了pluskid等人的文章。文末2013年的PDF是爲證。另,若是本文的圖片/公式沒法正常顯示,請點擊本文的**七月在線題庫版**。php
動筆寫這個支持向量機(support vector machine)是費了很多勁和困難的,緣由很簡單,一者這個東西自己就並很差懂,要深刻學習和研究下去需花費很多時間和精力,兩者這個東西也很差講清楚,儘管網上已經有朋友寫得不錯了(見文末參考連接),但在描述數學公式的時候仍是顯得不夠。得益於同窗白石的數學證實,我仍是想嘗試寫一下,但願本文在兼顧通俗易懂的基礎上,真真正正能足以成爲一篇完整歸納和介紹支持向量機的導論性的文章。html
本文在寫的過程當中,參考了很多資料,包括《支持向量機導論》、《統計學習方法》及網友pluskid的支持向量機系列等等,於此,仍是一篇學習筆記,只是加入了本身的理解和總結,有任何不妥之處,還望海涵。全文宏觀上總體認識支持向量機的概念和用處,微觀上深究部分定理的前因後果,證實及原理細節,力保邏輯清晰 & 通俗易懂。java
同時,閱讀本文時建議你們儘可能使用chrome等瀏覽器,如此公式才能更好的顯示,再者,閱讀時可拿張紙和筆出來,把本文全部定理.公式都親自推導一遍或者直接打印下來(可直接打印網頁版或本文文末附的PDF)在文稿上演算,從而享受隨時隨地思考、演算的極致快感。web
OK,仍是那句話,有任何問題,歡迎任何人隨時不吝指正 & 賜教,感謝。面試
支持向量機,因其英文名爲support vector machine,故通常簡稱SVM,通俗來說,它是一種二類分類模型,其基本模型定義爲特徵空間上的間隔最大的線性分類器,其學習策略即是間隔最大化,最終可轉化爲一個凸二次規劃問題的求解。算法
理解SVM,我們必須先弄清楚一個概念:線性分類器。spring
給定一些數據點,它們分別屬於兩個不一樣的類,如今要找到一個線性分類器把這些數據分紅兩類。若是用x表示數據點,用y表示類別(y能夠取1或者-1,分別表明兩個不一樣的類),一個線性分類器的學習目標即是要在n維的數據空間中找到一個超平面(hyper plane),這個超平面的方程能夠表示爲( wT中的T表明轉置):chrome
可能有讀者對類別取1或-1有疑問,事實上,這個1或-1的分類標準起源於logistic迴歸。編程
Logistic迴歸目的是從特徵學習出一個0/1分類模型,而這個模型是將特性的線性組合做爲自變量,因爲自變量的取值範圍是負無窮到正無窮。所以,使用logistic函數(或稱做sigmoid函數)將自變量映射到(0,1)上,映射後的值被認爲是屬於y=1的機率。瀏覽器
假設函數
其中x是n維特徵向量,函數g就是logistic函數。
而的圖像是
能夠看到,將無窮映射到了(0,1)。
而假設函數就是特徵屬於y=1的機率。
從而,當咱們要判別一個新來的特徵屬於哪一個類時,只需求便可,若大於0.5就是y=1的類,反之屬於y=0類。
此外,只和有關,>0,那麼,而g(z)只是用來映射,真實的類別決定權仍是在於。再者,當時,=1,反之=0。若是咱們只從出發,但願模型達到的目標就是讓訓練數據中y=1的特徵,而是y=0的特徵。Logistic迴歸就是要學習獲得,使得正例的特徵遠大於0,負例的特徵遠小於0,並且要在所有訓練實例上達到這個目標。
接下來,嘗試把logistic迴歸作個變形。首先,將使用的結果標籤y = 0和y = 1替換爲y = -1,y = 1,而後將()中的替換爲b,最後將後面的替換爲(即)。如此,則有了。也就是說除了y由y=0變爲y=-1外,線性分類函數跟logistic迴歸的形式化表示沒區別。
進一步,能夠將假設函數中的g(z)作一個簡化,將其簡單映射到y=-1和y=1上。映射關係以下:
下面舉個簡單的例子。以下圖所示,如今有一個二維平面,平面上有兩種不一樣的數據,分別用圈和叉表示。因爲這些數據是線性可分的,因此能夠用一條直線將這兩類數據分開,這條直線就至關於一個超平面,超平面一邊的數據點所對應的y全是-1 ,另外一邊所對應的y全是1。
這個超平面能夠用分類函數表示,當f(x) 等於0的時候,x即是位於超平面上的點,而f(x)大於0的點對應 y=1 的數據點,f(x)小於0的點對應y=-1的點,以下圖所示:
注:有的資料上定義特徵到結果的輸出函數,與這裏定義的實質是同樣的。爲何?由於不管是,仍是,不影響最終優化結果。下文你將看到,當咱們轉化到優化的時候,爲了求解方便,會把yf(x)令爲1,即yf(x)是y(w^x + b),仍是y(w^x - b),對咱們要優化的式子max1/||w||已無影響。
(有一朋友飛狗來自Mare_Desiderii,看了上面的定義以後,問道:請教一下SVM functional margin 爲=y(wTx+b)=yf(x)中的Y是隻取1和-1 嗎?y的惟一做用就是確保functional margin的非負性?真是這樣的麼?固然不是,詳情請見本文評論下第43樓)
換言之,在進行分類的時候,遇到一個新的數據點x,將x代入f(x) 中,若是f(x)小於0則將x的類別賦爲-1,若是f(x)大於0則將x的類別賦爲1。
接下來的問題是,如何肯定這個超平面呢?從直觀上而言,這個超平面應該是最適合分開兩類數據的直線。而斷定「最適合」的標準就是這條直線離直線兩邊的數據的間隔最大。因此,得尋找有着最大間隔的超平面。
在超平面w*x+b=0肯定的狀況下,|w*x+b|可以表示點x到距離超平面的遠近,而經過觀察w*x+b的符號與類標記y的符號是否一致可判斷****分類是否正確,因此,能夠用(y*(w*x+b))的正負性來斷定或表示分類的正確性。於此,咱們便引出了函數間隔(functional margin)的概念。
定義函數間隔(用表示)爲:
而超平面(w,b)關於T中全部樣本點(xi,yi)的函數間隔最小值(其中,x是特徵,y是結果標籤,i表示第i個樣本),便爲超平面(w, b)關於訓練數據集T的函數間隔:
**= **mini (i=1,...n)
但這樣定義的函數間隔有問題,即若是成比例的改變w和b(如將它們改爲2w和2b),則函數間隔的值f(x)卻變成了原來的2倍(雖然此時超平面沒有改變),因此只有函數間隔還遠遠不夠。
事實上,咱們能夠對法向量w加些約束條件,從而引出真正定義點到超平面的距離--幾何間隔(geometrical margin)的概念。
假定對於一個點 x ,令其垂直投影到超平面上的對應點爲 x0 ,w 是垂直於超平面的一個向量,爲樣本x到超平面的距離,以下圖所示:
根據平面幾何知識,有
其中||w||爲w的二階範數(範數是一個相似於模的表示長度的概念),是單位向量(一個向量除以它的模稱之爲單位向量)。
又因爲x0 是超平面上的點,知足 f(x0)=0,代入超平面的方程,可得,即。
隨即讓此式的兩邊同時乘以,再根據和,便可算出γ:
爲了獲得的絕對值,令乘上對應的類別 y,便可得出幾何間隔(用表示)的定義:
從上述函數間隔和幾何間隔的定義能夠看出:幾何間隔就是函數間隔除以||w||,並且函數間隔y*(wx+b) = y*f(x)實際上就是|f(x)|,只是人爲定義的一個間隔度量,而幾何間隔|f(x)|/||w||纔是直觀上的點到超平面的距離。
對一個數據點進行分類,當超平面離數據點的「間隔」越大,分類的確信度(confidence)也越大。因此,爲了使得分類的確信度儘可能高,須要讓所選擇的超平面可以最大化這個「間隔」值。這個間隔就是下圖中的Gap的一半。
經過由前面的分析可知:函數間隔不適合用來最大化間隔值,由於在超平面固定之後,能夠等比例地縮放w的長度和b的值,這樣能夠使得的值任意大,亦即函數間隔能夠在超平面保持不變的狀況下被取得任意大。但幾何間隔由於除上了,使得在縮放w和b的時候幾何間隔的值是不會改變的,它只隨着超平面的變更而變更,所以,這是更加合適的一個間隔。換言之,這裏要找的最大間隔分類超平面中的「間隔」指的是幾何間隔。
因而最大間隔分類器(maximum margin classifier)的目標函數能夠定義爲:
同時需知足一些條件,根據間隔的定義,有
其中,s.t.,即subject to的意思,它導出的是約束條件。
回顧下幾何間隔的定義,可知:若是令函數間隔等於1(之因此令等於1,是爲了方便推導和優化,且這樣作對目標函數的優化沒有影響,至於爲何,請見本文評論下第42樓回覆),則有 = 1 / ||w||且,從而上述目標函數轉化成了
至關於在相應的約束條件下,最大化這個1/||w||值,而1/||w||即是幾何間隔。
以下圖所示,中間的實線即是尋找到的最優超平面(Optimal Hyper Plane),其到兩條虛線邊界的距離相等,這個距離即是幾何間隔,兩條虛線間隔邊界之間的距離等於2,而虛線間隔邊界上的點則是支持向量。因爲這些支持向量恰好在虛線間隔邊界上,因此它們知足(還記得咱們把 functional margin 定爲 1 了嗎?上節中:處於方便推導和優化的目的,咱們能夠令=1),而對於全部不是支持向量的點,則顯然有。
OK,到此爲止,算是瞭解到了SVM的第一層,對於那些只關心怎麼用SVM的朋友便已足夠,沒必要再更進一層深究其更深的原理。
2.1.一、從原始問題到對偶問題的求解
接着考慮以前獲得的目標函數:
因爲求的最大值至關於求的最小值,因此上述目標函數等價於(w由分母變成分子,從而也有原來的max問題變爲min問題,很明顯,二者問題等價):
由於如今的目標函數是二次的,約束條件是線性的,因此它是一個凸二次規劃問題。這個問題能夠用現成的QP (Quadratic Programming) 優化包進行求解。一言以蔽之:在必定的約束條件下,目標最優,損失最小。
此外,因爲這個問題的特殊結構,還能夠經過拉格朗日對偶性(Lagrange Duality)變換到對偶變量 (dual variable) 的優化問題,即經過求解與原問題等價的對偶問題(dual problem)獲得原始問題的最優解,這就是線性可分條件下支持向量機的對偶算法,這樣作的優勢在於:一者對偶問題每每更容易求解;兩者能夠天然的引入核函數,進而推廣到非線性分類問題。
那什麼是拉格朗日對偶性呢?簡單來說,經過給每個約束條件加上一個拉格朗日乘子(Lagrange multiplier),定義拉格朗日函數(經過拉格朗日函數將約束條件融合到目標函數裏去,從而只用一個函數表達式便能清楚的表達出咱們的問題):
而後令
容易驗證,當某個約束條件不知足時,例如,那麼顯然有(只要令便可)。而當全部約束條件都知足時,則最優值爲,亦即最初要最小化的量。
所以,在要求約束條件獲得知足的狀況下最小化,實際上等價於直接最小化(固然,這裏也有約束條件,就是≥0,i=1,…,n) ,由於若是約束條件沒有獲得知足,會等於無窮大,天然不會是咱們所要求的最小值。
具體寫出來,目標函數變成了:
這裏用表示這個問題的最優值,且和最初的問題是等價的。若是直接求解,那麼一上來便得面對w和b兩個參數,而又是不等式約束,這個求解過程很差作。不妨把最小和最大的位置交換一下,變成:
交換之後的新問題是原始問題的對偶問題,這個新問題的最優值用來表示。並且有≤,在知足某些條件的狀況下,這二者相等,這個時候就能夠經過求解對偶問題來間接地求解原始問題。
換言之,之因此從minmax的原始問題,轉化爲maxmin的對偶問題,一者由於是的近似解,兩者,轉化爲對偶問題後,更容易求解。
下面能夠先求L 對w、b的極小,再求L 對的極大。
2.1.二、KKT條件
上文中提到「≤在知足某些條件的狀況下,二者等價」,這所謂的「知足某些條件」就是要知足KKT條件。
勘誤:經讀者qq_28543029指出,這裏的條件不該該是KKT條件,要讓二者等價需知足strong duality (強對偶),然後有學者在強對偶下提出了KKT條件,且KKT條件的成立要知足constraint qualifications,而constraint qualifications之一就是Slater條件。所謂Slater 條件,即指:凸優化問題,若是存在一個點x,使得全部等式約束都成立,而且全部不等式約束都嚴格成立(即取嚴格不等號,而非等號),則知足Slater 條件。對於此處,Slater 條件成立,因此d*≤p*能夠取等號。
通常地,一個最優化數學模型可以表示成下列標準形式:
其中,f(x)是須要最小化的函數,h(x)是等式約束,g(x)是不等式約束,p和q分別爲等式約束和不等式約束的數量。
同時,得明白如下兩點:
而KKT條件就是指上面最優化數學模型的標準形式中的最小點 x* 必須知足下面的條件:
通過論證,咱們這裏的問題是知足 KKT 條件的(首先已經知足Slater條件,再者f和gi也都是可微的,即L對w和b均可導),所以如今咱們便轉化爲求解第二個問題。
也就是說,原始問題經過知足KKT條件,已經轉化成了對偶問題。而求解這個對偶學習問題,分爲3個步驟:首先要讓L(w,b,a) 關於 w 和 b 最小化,而後求對的極大,最後利用SMO算法求解對偶問題中的拉格朗日乘子。
2.1.三、對偶問題求解的3個步驟
(1) 、首先固定*,* 要讓 L 關於 w 和 b 最小化,咱們分別對w,b求偏導數,即令 ∂L/∂w 和 ∂L/∂b 等於零(對w求導結果的解釋請看本文評論下第45樓回覆):
將以上結果代入以前的L:
獲得:
提醒:有讀者可能會問上述推導過程如何而來?說實話,其具體推導過程是比較複雜的,以下圖所示:
最後,獲得:
如 jerrylead所說:「倒數第4步」推導到「倒數第3步」使用了線性代數的轉置運算,因爲ai和yi都是實數,所以轉置後與自身同樣。「倒數第3步」推導到「倒數第2步」使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法運算法則。最後一步是上一步的順序調整。
從上面的最後一個式子,咱們能夠看出,此時的拉格朗日函數只包含了一個變量,那就是(求出了便能求出w,和b,因而可知,上文第1.2節提出來的核心問題:分類函數****也就能夠垂手可得的求出來了)。
(2) 、求對*的極大,* 便是關於對偶問題的最優化問題。通過上面第一個步驟的求w和b,獲得的拉格朗日函數式子已經沒有了變量w,b,只有。從上面的式子獲得:
這樣,求出了,根據,便可求出w,而後經過,便可求出b,最終得出分離超平面和分類決策函數。
(3) 在求得L(w, b, a) 關於 w 和 b 最小化,以及對的極大以後,最後一步則能夠利用SMO算法求解對偶問題中的拉格朗日乘子。
上述式子要解決的是在參數上求最大值W的問題,至於和都是已知數。要了解這個SMO算法是如何推導的,請跳到下文第3.5節、SMO算法。
到目前爲止,咱們的 SVM 還比較弱,只能處理線性的狀況,下面咱們將引入核函數,進而推廣到非線性分類問題。
2.1.四、線性不可分的狀況
OK,爲過渡到下節2.2節所介紹的核函數,讓咱們再來看看上述推導過程當中獲得的一些有趣的形式。首先就是關於咱們的 hyper plane ,對於一個數據點 x 進行分類,其實是經過把 x 帶入到算出結果真後根據其正負號來進行類別劃分的。而前面的推導中咱們獲得
所以分類函數爲:
這裏的形式的有趣之處在於,對於新點 x的預測,只須要計算它與訓練數據點的內積便可(表示向量內積),這一點相當重要,是以後使用 Kernel 進行非線性推廣的基本前提。此外,所謂 Supporting Vector 也在這裏顯示出來——事實上,全部非Supporting Vector 所對應的係數都是等於零的,所以對於新點的內積計算實際上只要針對少許的「支持向量」而不是全部的訓練數據便可。
爲何非支持向量對應的等於零呢?直觀上來理解的話,就是這些「後方」的點——正如咱們以前分析過的同樣,對超平面是沒有影響的,因爲分類徹底有超平面決定,因此這些無關的點並不會參與分類問題的計算,於是也就不會產生任何影響了。
回憶一下咱們2.1.1節中經過 Lagrange multiplier獲得的目標函數:
注意到若是 x i 是支持向量的話,上式中紅顏色的部分是等於 0 的(由於支持向量的 functional margin 等於 1 ),而對於非支持向量來講,functional margin 會大於 1 ,所以紅顏色部分是大於零的,而又是非負的,爲了知足最大化,必須等於 0 。這也就是這些非Supporting Vector 的點的侷限性。
至此,咱們便獲得了一個maximum margin hyper plane classifier,這就是所謂的支持向量機(Support Vector Machine)。固然,到目前爲止,咱們的 SVM 還比較弱,只能處理線性的狀況,不過,在獲得了對偶dual 形式以後,經過 Kernel 推廣到非線性的狀況就變成了一件很是容易的事情了(相信,你還記得本節開頭所說的:「經過求解對偶問題獲得最優解,這就是線性可分條件下支持向量機的對偶算法,這樣作的優勢在於:一者對偶問題每每更容易求解;兩者能夠天然的引入核函數,進而推廣到非線性分類問題」)。
2.2.一、特徵空間的隱式映射:核函數
事實上,大部分時候數據並非線性可分的,這個時候知足這樣條件的超平面就根本不存在。在上文中,咱們已經瞭解到了SVM處理線性可分的狀況,那對於非線性的數據SVM咋處理呢?對於非線性的狀況,SVM 的處理方法是選擇一個核函數 κ(⋅,⋅) ,經過將數據映射到高維空間,來解決在原始空間中線性不可分的問題。
具體來講,在線性不可分的狀況下,支持向量機首先在低維空間中完成計算,而後經過核函數將輸入空間映射到高維特徵空間,最終在高維特徵空間中構造出最優分離超平面,從而把平面上自己很差分的非線性數據分開。如圖所示,一堆數據在二維空間沒法劃分,從而映射到三維空間裏劃分:
而在咱們遇到核函數以前,若是用原始的方法,那麼在用線性學習器學習一個非線性關係,須要選擇一個非線性特徵集,而且將數據寫成新的表達形式,這等價於應用一個固定的非線性映射,將數據映射到特徵空間,在特徵空間中使用線性學習器,所以,考慮的假設集是這種類型的函數:
這裏ϕ:X->F是從輸入空間到某個特徵空間的映射,這意味着創建非線性學習器分爲兩步:
而因爲對偶形式就是線性學習器的一個重要性質,這意味着假設能夠表達爲訓練點的線性組合,所以決策規則能夠用測試點和訓練點的內積來表示:
若是有一種方式能夠在特徵空間中直接計算內積〈φ(xi · φ(x) 〉,就像在原始輸入點的函數中同樣,就有可能將兩個步驟融合到一塊兒創建一個非線性的學習器,這樣直接計算法的方法稱爲核函數方法:
核是一個函數K,對全部x,z(-X,知足,這裏φ是從X到內積特徵空間F的映射。
2.2.二、核函數:如何處理非線性數據
來看個核函數的例子。以下圖所示的兩類數據,分別分佈爲兩個圓圈的形狀,這樣的數據自己就是線性不可分的,此時我們該如何把這兩類數據分開呢(下文將會有一個相應的三維空間圖)?
事實上,上圖所述的這個數據集,是用兩個半徑不一樣的圓圈加上了少許的噪音生成獲得的,因此,一個理想的分界應該是一個「圓圈」而不是一條線(超平面)。若是用和來表示這個二維平面的兩個座標的話,咱們知道一條二次曲線(圓圈是二次曲線的一種特殊狀況)的方程能夠寫做這樣的形式:
注意上面的形式,若是咱們構造另一個五維的空間,其中五個座標的值分別爲, , , ,,那麼顯然,上面的方程在新的座標系下能夠寫做:
關於新的座標,這正是一個 hyper plane 的方程!也就是說,若是咱們作一個映射,將 按照上面的規則映射爲,那麼在新的空間中原來的數據將變成線性可分的,從而使用以前咱們推導的線性分類算法就能夠進行處理了。這正是 Kernel 方法處理非線性問題的基本思想。
再進一步描述 Kernel 的細節以前,不妨再來看看上述例子在映射事後的直觀形態。固然,你我可能沒法把 5 維空間畫出來,不過因爲我這裏生成數據的時候用了特殊的情形,因此這裏的超平面實際的方程是這個樣子的(圓心在軸上的一個正圓):
所以我只須要把它映射到,,這樣一個三維空間中便可,下圖便是映射以後的結果,將座標軸通過適當的旋轉,就能夠很明顯地看出,數據是能夠經過一個平面來分開的(pluskid:下面的gif 動畫,先用 Matlab 畫出一張張圖片,再用 Imagemagick 拼貼成):
核函數至關於把原來的分類函數:
映射成:
而其中的能夠經過求解以下 dual 問題而獲得的:
這樣一來問題就解決了嗎?彷佛是的:拿到非線性數據,就找一個映射,而後一股腦把原來的數據映射到新空間中,再作線性 SVM 便可。不過事實上好像並無這麼簡單。
細想一下,剛纔的方法是否是有問題?
這個時候,可能就須要 Kernel 出馬了。
不妨仍是從最開始的簡單例子出發,設兩個向量和,而便是到前面說的五維空間的映射,所以映射事後的內積爲:
(公式說明:上面的這兩個推導過程當中,所說的前面的五維空間的映射,這裏說的前面即是文中2.2.1節的所述的映射方式,回顧下以前的映射規則,再看那第一個推導,其實就是計算x1,x2各自的內積,而後相乘相加便可,第二個推導則是直接平方,去掉括號,也很容易推出來)
另外,咱們又注意到:
兩者有不少類似的地方,實際上,咱們只要把某幾個維度線性縮放一下,而後再加上一個常數維度,具體來講,上面這個式子的計算結果實際上和映射
以後的內積的結果是相等的,那麼區別在於什麼地方呢?
(公式說明:上面之中,最後的兩個式子,第一個算式,是帶內積的徹底平方式,能夠拆開,而後,經過湊一個獲得,第二個算式,也是根據第一個算式湊出來的)
回憶剛纔提到的映射的維度爆炸,在前一種方法已經沒法計算的狀況下,後一種方法卻依舊能從容處理,甚至是無窮維度的狀況也沒有問題。
咱們把這裏的計算兩個向量在隱式映射事後的空間中的內積的函數叫作核函數 (Kernel Function) ,例如,在剛纔的例子中,咱們的核函數爲:
核函數能簡化映射空間中的內積運算——恰好「碰巧」的是,在咱們的 SVM 裏須要計算的地方數據向量老是之內積的形式出現的。對比剛纔咱們上面寫出來的式子,如今咱們的分類函數爲:
其中 由以下 dual 問題計算而得:
這樣一來計算的問題就算解決了,避開了直接在高維空間中進行計算,而結果倒是等價的!固然,由於咱們這裏的例子很是簡單,因此我能夠手工構造出對應於的核函數出來,若是對於任意一個映射,想要構造出對應的核函數就很困難了。
2.2.三、幾個核函數
一般人們會從一些經常使用的核函數中選擇(根據問題和數據的不一樣,選擇不一樣的參數,實際上就是獲得了不一樣的核函數),例如:
2.2.四、核函數的本質
上面說了這麼一大堆,讀者可能仍是沒明白核函數究竟是個什麼東西?我再簡要歸納下,即如下三點:
最後引用這裏的一個例子舉例說明下核函數解決非線性問題的直觀效果。
假設如今你是一個農場主,圈養了一批羊羣,但爲預防狼羣襲擊羊羣,你須要搭建一個籬笆來把羊羣圍起來。可是籬笆應該建在哪裏呢?你極可能須要依據牛羣和狼羣的位置創建一個「分類器」,比較下圖這幾種不一樣的分類器,咱們能夠看到SVM完成了一個很完美的解決方案。
這個例子從側面簡單說明了SVM使用非線性分類器的優點,而邏輯模式以及決策樹模式都是使用了直線方法。
OK,再也不作過多介紹了,對核函數有進一步興趣的,還能夠看看此文。
在本文第一節最開始討論支持向量機的時候,咱們就假定,數據是線性可分的,亦即咱們能夠找到一個可行的超平面將數據徹底分開。後來爲了處理非線性數據,在上文2.2節使用 Kernel 方法對原來的線性 SVM 進行了推廣,使得非線性的的狀況也能處理。雖然經過映射將原始數據映射到高維空間以後,可以線性分隔的機率大大增長,可是對於某些狀況仍是很難處理。
例如可能並非由於數據自己是非線性結構的,而只是由於數據有噪音。對於這種偏離正常位置很遠的數據點,咱們稱之爲 outlier ,在咱們原來的 SVM 模型裏,outlier 的存在有可能形成很大的影響,由於超平面自己就是隻有少數幾個 support vector 組成的,若是這些 support vector 裏又存在 outlier 的話,其影響就很大了。例以下圖:
用黑圈圈起來的那個藍點是一個 outlier ,它偏離了本身本來所應該在的那個半空間,若是直接忽略掉它的話,原來的分隔超平面仍是挺好的,可是因爲這個 outlier 的出現,致使分隔超平面不得不被擠歪了,變成途中黑色虛線所示(這只是一個示意圖,並無嚴格計算精確座標),同時 margin 也相應變小了。固然,更嚴重的狀況是,若是這個 outlier 再往右上移動一些距離的話,咱們將沒法構造出能將數據分開的超平面來。
爲了處理這種狀況,SVM 容許數據點在必定程度上偏離一下超平面。例如上圖中,黑色實線所對應的距離,就是該 outlier 偏離的距離,若是把它移動回來,就恰好落在原來的 超平面 藍色間隔邊界上,而不會使得超平面發生變形了。
插播下一位讀者@Copper_PKU的理解: 「 換言之,在有鬆弛的狀況下outline點也屬於支持向量SV,同時,對於不一樣的支持向量,拉格朗日參數的值也不一樣,如此篇論文《Large Scale Machine Learning》中的下圖所示:
對於遠離分類平面的點值爲0;對於邊緣上的點值在[0, 1/L]之間,其中,L爲訓練數據集個數,即數據集大小;對於outline數據和內部的數據值爲1/L。更多請參看本文文末參考條目第51條。 」
OK,繼續回到我們的問題。咱們,原來的約束條件爲:
如今考慮到outlier問題,約束條件變成了:
其中稱爲鬆弛變量 (slack variable) ,對應數據點容許偏離的 functional margin 的量。固然,若是咱們運行任意大的話,那任意的超平面都是符合條件的了。因此,咱們在原來的目標函數後面加上一項,使得這些的總和也要最小:
其中 是一個參數,用於控制目標函數中兩項(「尋找 margin 最大的超平面」和「保證數據點誤差量最小」)之間的權重。注意,其中 是須要優化的變量(之一),而 是一個事先肯定好的常量。完整地寫出來是這個樣子:
用以前的方法將限制或約束條件加入到目標函數中,獲得新的拉格朗日函數,以下所示:
分析方法和前面同樣,轉換爲另外一個問題以後,咱們先讓針對、和最小化:
將 帶回 並化簡,獲得和原來同樣的目標函數:
不過,因爲咱們獲得而又有(做爲 Lagrange multiplier 的條件),所以有,因此整個 dual 問題如今寫做:
把先後的結果對比一下(錯誤修正:圖中的Dual formulation中的Minimize應爲maxmize):
能夠看到惟一的區別就是如今 dual variable 多了一個上限 。而 Kernel 化的非線性形式也是同樣的,只要把換成便可。這樣一來,一個完整的,能夠處理線性和非線性並能容忍噪音和 outliers 的支持向量機才終於介紹完畢了。
行文至此,能夠作個小結,不許確的說,SVM它本質上便是一個分類方法,用w^T+b定義分類函數,因而求w、b,爲尋最大間隔,引出1/2||w||^2,繼而引入拉格朗日因子,化爲對拉格朗日乘子a的求解(求解過程當中會涉及到一系列最優化或凸二次規劃等問題),如此,求w.b與求a等價,而a的求解能夠用一種快速學習算法SMO,至於核函數,是爲處理非線性狀況,若直接映射到高維計算恐維度爆炸,故在低維計算,等效高維表現。
OK,理解到這第二層,已經能知足絕大部分人一窺SVM原理的好奇心,然對於那些想在證實層面理解SVM的則還很不夠,但進入第三層理解境界以前,你必需要有比較好的數理基礎和邏輯證實能力,否則你會跟我同樣,吃很多苦頭的。
說實話,凡是涉及到要證實的東西.理論,便通常不是怎麼好惹的東西。絕大部分時候,看懂一個東西不難,但證實一個東西則須要點數學功底,進一步,證實一個東西也不是特別難,難的是從零開始發明創造這個東西的時候,則顯艱難(由於任什麼時候代,大部分人的研究所得都不過是基於前人的研究成果,前人所作的是開創性工做,而這每每是最艱難最有價值的,他們被稱爲真正的先驅。牛頓也曾說過,他不過是站在巨人的肩上。你,我則更是如此)。
正如陳希孺院士在他的著做《數理統計學簡史》的第4章、最小二乘法中所講:在科研上諸多觀念的革新和突破是有着不少的不易的,或許某個定理在某個時期由某我的點破了,如今的咱們看來一切都是理所固然,但在一切沒有發現以前,可能許許多多的頂級學者畢其功於一役,耗盡一輩子,努力了幾十年最終也是無功而返。
話休絮煩,要證實一個東西先要弄清楚它的根基在哪,即構成它的基礎是哪些理論。OK,如下內容基本是上文中未講到的一些定理的證實,包括其背後的邏輯、來源背景等東西,仍是讀書筆記。
本部分導述
3.1.一、感知機算法
這個感知機算法是1956年提出的,年代久遠,依然影響着當今,固然,能夠確定的是,此算法亦非最優,後續會有更詳盡闡述。不過,有一點,你必須清楚,這個算法是爲了幹嗎的:不斷的訓練試錯以期尋找一個合適的超平面(是的,就這麼簡單)。
下面,舉個例子。以下圖所示,憑咱們的直覺能夠看出,圖中的紅線是最優超平面,藍線則是根據感知機算法在不斷的訓練中,最終,若藍線能經過不斷的訓練移動到紅線位置上,則表明訓練成功。
既然須要經過不斷的訓練以讓藍線最終成爲最優分類超平面,那麼,到底須要訓練多少次呢?Novikoff定理告訴咱們當間隔是正的時候感知機算法會在有限次數的迭代中收斂,也就是說Novikoff定理證實了感知機算法的收斂性,即能獲得一個界,不至於無窮循環下去。
這裏,爲擴充間隔。根據誤分次數公式可知, 迭代次數與對應於擴充(包括偏置)權重的訓練集的間隔有關。
順便再解釋下這個所謂的擴充間隔,即爲樣本到分類間隔的距離,即從引出的最大分類間隔。OK,還記得上文第1.3節開頭的內容麼?以下: 「
在給出幾何間隔的定義以前,我們首先來看下,如上圖所示,對於一個點x,令其垂直投影到超平面上的對應的爲x0,因爲w是垂直於超平面的一個向量,爲樣本x到分類間隔的距離,咱們有
」
而後後續怎麼推導出最大分類間隔請回到本文第1、二部分,此處不重複板書。
同時有一點得注意:感知機算法雖然能夠經過簡單迭代對線性可分數據生成正確分類的超平面,但不是最優效果,那怎樣才能獲得最優效果呢,就是上文中第一部分所講的尋找最大分類間隔超平面。此外,Novikoff定理的證實請見這裏。
3.2.一、Mercer定理
Mercer定理 :若是函數K是上的映射(也就是從兩個n維向量映射到實數域)。那麼若是K是一個有效核函數(也稱爲Mercer核函數),那麼當且僅當對於訓練樣例,其相應的核函數矩陣是對稱半正定的。
要理解這個Mercer定理,先要了解什麼是半正定矩陣,要了解什麼是半正定矩陣,先得知道什麼是正定矩陣(矩陣理論博大精深,關於矩陣推薦我正在看的一本《矩陣分析與應用》)。而後這裏有一個此定理的證實,能夠看下。
正如@Copper_PKU所說:核函數在SVM的分類效果中起了重要的做用,最後這裏有個tutorial能夠看看。
在本文1.0節有這麼一句話「支持向量機(SVM)是90年代中期發展起來的基於統計學習理論的一種機器學習方法,經過尋求結構化風險最小來提升學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的狀況下,亦能得到良好統計規律的目的。」但初次看到的讀者可能並不瞭解什麼是結構化風險,什麼又是經驗風險。要了解這兩個所謂的「風險」,還得又從監督學習提及。
監督學習實際上就是一個經驗風險或者結構風險函數的最優化問題。風險函數度量平均意義下模型預測的好壞,模型每一次預測的好壞用損失函數來度量。它從假設空間F中選擇模型f做爲決策函數,對於給定的輸入X,由f(X)給出相應的輸出Y,這個輸出的預測值f(X)與真實值Y可能一致也可能不一致,用一個損失函數來度量預測錯誤的程度。損失函數記爲L(Y, f(X))。
經常使用的損失函數有如下幾種(基本引用自《統計學習方法》):
如此,SVM有第二種理解,即最優化+損失最小,或如@夏粉_百度所說「可從損失函數和優化算法角度看SVM,boosting,LR等算法,可能會有不一樣收穫」。
OK,關於更多統計學習方法的問題,請參看此文。
關於損失函數,以下文讀者評論中所述:能夠看看張潼的這篇《Statistical behavior and consistency of classification methods based on convex risk minimization》。各類算法中經常使用的損失函數基本都具備fisher一致性,優化這些損失函數獲得的分類器能夠看做是後驗機率的「代理」。此外,張潼還有另一篇論文《Statistical analysis of some multi-category large margin classification methods》,在多分類狀況下margin loss的分析,這兩篇對Boosting和SVM使用的損失函數分析的很透徹。
3.4.一、什麼是最小二乘法?
既然本節開始以前提到了最小二乘法,那麼下面引用《正態分佈的前世此生》裏的內容稍微簡單闡述下。
咱們口頭中常常說:通常來講,平均來講。如平均來講,不吸菸的健康優於吸菸者,之因此要加「平均」二字,是由於凡事皆有例外,總存在某個特別的人他吸菸但因爲常常鍛鍊因此他的健康情況可能會優於他身邊不吸菸的朋友。而最小二乘法的一個最簡單的例子即是算術平均。
最小二乘法(又稱最小平方法)是一種數學優化技術。它經過最小化偏差的平方和尋找數據的最佳函數匹配。利用最小二乘法能夠簡便地求得未知的數據,並使得這些求得的數據與實際數據之間偏差的平方和爲最小。用函數表示爲:
使偏差「所謂偏差,固然是觀察值與實際真實值的差量」平方和達到最小以尋求估計值的方法,就叫作最小二乘法,用最小二乘法獲得的估計,叫作最小二乘估計。固然,取平方和做爲目標函數只是衆多可取的方法之一。
最小二乘法的通常形式可表示爲:
有效的最小二乘法是勒讓德在 1805 年發表的,基本思想就是認爲測量中有偏差,因此全部方程的累積偏差爲
咱們求解出致使累積偏差最小的參數便可:
勒讓德在論文中對最小二乘法的優良性作了幾點說明:
對於最後一點,從統計學的角度來看是很重要的一個性質。推理以下:假設真值爲,x1, ... , xn爲n次測量值, 每次測量的偏差爲ei = xi - ,按最小二乘法,偏差累積爲
求解 使達到最小,正好是算術平均。
因爲算術平均是一個歷經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,因此從另外一個角度說明了最小二乘方法的優良性,使咱們對最小二乘法更加有信心。
最小二乘法發表以後很快獲得了你們的承認接受,並迅速的在數據分析實踐中被普遍使用。不過歷史上又有人把最小二乘法的發明歸功於高斯,這又是怎麼一回事呢。高斯在1809年也發表了最小二乘法,而且聲稱本身已經使用這個方法多年。高斯發明了小行星定位的數學方法,並在數據分析中使用最小二乘方法進行計算,準確的預測了穀神星的位置。
說了這麼多,貌似跟本文的主題SVM沒啥關係呀,別急,請讓我繼續闡述。本質上說,最小二乘法便是一種參數估計方法,說到參數估計,我們得從一元線性模型提及。
3.4.二、最小二乘法的解法
什麼是一元線性模型呢? 請容許我引用這裏的內容,先來梳理下幾個基本概念:
對於一元線性迴歸模型, 假設從整體中獲取了n組觀察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。對於平面中的這n個點,能夠使用無數條曲線來擬合。要求樣本回歸函數儘量好地擬合這組值。綜合起來看,這條直線處於樣本數據的中心位置最合理。
選擇最佳擬合曲線的標準能夠肯定爲:使總的擬合偏差(即總殘差)達到最小。有如下三個標準能夠選擇:
最經常使用的是普通最小二乘法( Ordinary Least Square,OLS):所選擇的迴歸模型應該使全部觀察值的殘差平方和達到最小,即採用平方損失函數。
咱們定義樣本回歸模型爲:
其中ei爲樣本(Xi, Yi)的偏差。
接着,定義平方損失函數Q:
則經過Q最小肯定這條直線,即肯定,以爲變量,把它們看做是Q的函數,就變成了一個求極值的問題,能夠經過求導數獲得。
求Q對兩個待估參數的偏導數:
根據數學知識咱們知道,函數的極值點爲偏導爲0的點。
解得:
這就是最小二乘法的解法,就是求得平方損失函數的極值點。自此,你看到求解最小二乘法與求解SVM問題何等類似,尤爲是定義損失函數,然後經過偏導求得極值。
OK,更多請參看陳希孺院士的《數理統計學簡史》的第4章、最小二乘法。
在上文中,咱們提到了求解對偶問題的序列最小最優化SMO算法,但並未提到其具體解法。首先看下最後懸而未決的問題:
等價於求解:
1998年,Microsoft Research的John C. Platt在論文《Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》中提出針對上述問題的解法:SMO算法,它很快便成爲最快的二次規劃優化算法,特別是在針對線性SVM和數據稀疏時性能更優。
接下來,我們便參考John C. Platt的這篇文章來看看SMO的解法是怎樣的。
3.5.一、SMO算法的推導
我們首先來定義特徵到結果的輸出函數:
注:這個u與咱們以前定義的實質是同樣的。
接着,從新定義下我們原始的優化問題,權當從新回顧,以下:
求導獲得:
代入中,可得。
經過引入拉格朗日乘子轉換爲對偶問題後,得:
s.t:
且
注:這裏獲得的min函數與咱們以前的max函數實質也是同樣,由於把符號變下,即由min轉化爲max的問題,且yi也與以前的等價,yj亦如此。
通過加入鬆弛變量後,模型修改成:
從而最終咱們的問題變爲:
下面要解決的問題是:在上求上述目標函數的最小值。爲了求解這些乘子,每次從中任意抽取兩個乘子和,而後固定和之外的其它乘子,使得目標函數只是關於和的函數。這樣,不斷的從一堆乘子中任意抽取兩個求解,不斷的迭代求解子問題,最終達到求解原問題的目的。
而原對偶問題的子問題的目標函數能夠表達爲:
其中
爲了解決這個子問題,首要問題即是每次如何選取和。實際上,其中一個乘子是違法KKT條件最嚴重的,另一個乘子則由另外一個約束條件選取。
根據KKT條件能夠得出目標函數中取值的意義:
這裏的仍是拉格朗日乘子:
而最優解須要知足KKT條件,即上述3個條件都得知足,如下幾種狀況出現將會出現不知足:
也就是說,若是存在不知足KKT條件的,那麼須要更新這些,這是第一個約束條件。此外,更新的同時還要受到第二個約束條件的限制,即
所以,若是假設選擇的兩個乘子和,它們在更新以前分別是、,更新以後分別是、,那麼更新先後的值須要知足如下等式才能保證和爲0的約束:
其中,是常數。
兩個因子很差同時求解,因此可先求第二個乘子的解(),獲得的解()以後,再用的解()表示的解()。
爲了求解,得先肯定的取值範圍。假設它的上下邊界分別爲H和L,那麼有:
接下來,綜合和這兩個約束條件,求取的取值範圍。
當y1 != y2時,根據可得,因此有,,以下圖所示:
當y1 = y2時,一樣根據可得:,因此有,,以下圖所示:
如此,根據y1和y2異號或同號,可得出的上下界分別爲:
回顧下第二個約束條件,令上式兩邊乘以y1,可得
其中,。
所以能夠用表示,,從而把子問題的目標函數轉換爲只含的問題:
對求導,可得
化簡下:
而後將、、和代入上式可得:
令(表示預測值與真實值之差),,而後上式兩邊同時除以,獲得一個關於單變量的解:
這個解沒有考慮其約束條件,便是未經剪輯時的解。
而後考慮約束可獲得通過剪輯後的的解析解爲:
求出了後,即可以求出,得。
那麼如何選擇乘子和呢?
而b在知足下述條件:
下更新b:
且每次更新完兩個乘子的優化後,都須要再從新計算b,及對應的Ei值。
最後更新全部,y和b,這樣模型就出來了,從而便可求出我們開頭提出的分類函數:
此外,這裏也有一篇相似的文章,你們能夠參考下。
3.5.二、SMO算法的步驟
綜上,總結下SMO的主要步驟,以下:
意思是,
假定在某一次迭代中,須要更新,對應的拉格朗日乘子,,那麼這個小規模的二次規劃問題寫爲:
那麼在每次迭代中,如何更新乘子呢?引用這裏的兩張PPT說明下:
知道了如何更新乘子,那麼選取哪些乘子進行更新呢?具體選擇方法有如下兩個步驟:
最後,每次更新完兩個乘子的優化後,都須要再從新計算b,及對應的Ei值。
綜上,SMO算法的基本思想是將Vapnik在1982年提出的Chunking方法推到極致,SMO算法每次迭代只選出兩個份量ai和aj進行調整,其它份量則保持固定不變,在獲得解ai和aj以後,再用ai和aj改進其它份量。與一般的分解算法比較,儘管它可能須要更多的迭代次數,但每次迭代的計算量比較小,因此該算法表現出較好的快速收斂性,且不須要存儲核矩陣,也沒有矩陣運算。
3.5.三、SMO算法的實現
行文至此,我相信,SVM理解到了必定程度後,是的確能在腦海裏從頭到尾推導出相關公式的,最初分類函數,最大化分類間隔,max1/||w||,min1/2||w||^2,凸二次規劃,拉格朗日函數,轉化爲對偶問題,SMO算法,都爲尋找一個最優解,一個最優分類平面。一步步梳理下來,爲何這樣那樣,太多東西能夠追究,最後實現。以下圖所示:
至於下文中將闡述的核函數則爲是爲了更好的處理非線性可分的狀況,而鬆弛變量則是爲了糾正或約束少許「不安分」或脫離集體很差歸類的因子。
臺灣的林智仁教授寫了一個封裝SVM算法的libsvm庫,你們能夠看看,此外這裏還有一份libsvm的註釋文檔。
除了在這篇論文《fast training of support vector machines using sequential minimal optimization》中platt給出了SMO算法的邏輯代碼以外,這裏也有一份SMO的實現代碼,你們能夠看下。
或許咱們已經聽到過,SVM在不少諸如文本分類,圖像分類,生物序列分析和生物數據挖掘,手寫字符識別等領域有不少的應用,但或許你並沒強烈的意識到,SVM能夠成功應用的領域遠遠超出如今已經在開發應用了的領域。
3.6.一、文本分類
一個文本分類系統不只是一個天然語言處理系統,也是一個典型的模式識別系統,系統的輸入是須要進行分類處理的文本,系統的輸出則是與文本關聯的類別。因爲篇幅所限,其它更具體內容本文將再也不詳述。
OK,本節雖取標題爲證實SVM,但聰明的讀者們想必早已看出,其實本部分並沒有多少證實部分(特此致歉),怎麼辦呢?能夠參閱《支持向量機導論》一書,此書精簡而有趣。本節完。
本文發表後,微博上的不少朋友給了很多意見,如下是節選的一些精彩評論:
很是享受這種全民大討論的年代,沒有誰必定就對或必定就錯,而是各自發表各自的理解看法,真棒!
OK,此文從最初2012年5月開始動筆,到後續不斷的修改,創造了三個之最,即所寫時間最長,所花心血最大,所改次數最多,由於個人目標是讓沒有任何機器學習基礎的都能看懂此文,因此老是不停的改,不停的改,不想放過任何一個小的細節。再者,引用侯捷的一句話是:天下大做,必做於細。
最後,很是感謝pluskid及諸多朋友們的文章及著做,讓我有機會在其基礎上總結、深刻。有任何問題,敬請廣大讀者隨時不吝批評指正,感謝。
本文PDF版
本文會一直不斷翻新,再者,上述 4 個PDF的閱讀體驗也還不是最好的,若是有朋友製做了更好的PDF,歡迎分享給我:weibo.com/julyweibo,謝謝。
July、二零一六年一月十七日第N次修改(N > 100)。
重大消息:個人新書《編程之法:面試和算法心得》終於在2015年10月14日上架開賣了!京東搶購地址:item.jd.com/11786791.ht…。京東、噹噹、亞馬遜等各大網店均已有現貨銷售。新書收錄了本篇SVM,且新書質量遠高於博客。July、二零一五年十月二十九日。