1. 程式人生 > 其它 >svm原理學習過程https://www.cnblogs.com/xiaomacgrady/articles/5078762.html

svm原理學習過程https://www.cnblogs.com/xiaomacgrady/articles/5078762.html

1初次理解SVM,咱們必須先弄清楚一個概念:線性分類器。

給定一些資料點,它們分別屬於兩個不同的類,現在要找到一個線性分類器把這些資料分成兩類。如果用x表示資料點,用y表示類別(y可以取1或者-1,分別代表兩個不同的類),一個線性分類器的學習目標便是要在n維的資料空間中找到一個超平面(hyperplane),這個超平面的方程可以表示為(wT中的T代表轉置):

可能有讀者對類別取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上。對映關係如下:
1.1線性分類的一個例子 下面舉個簡單的例子,如下圖所示,現在有一個二維平面,平面上有兩種不同的資料,分別用圈和叉表示。由於這些資料是線性可分的,所以可以用一條直線將這兩類資料分開,直線就相當於一個超平面,超平面一邊資料點所對應的y全是-1,另一邊的y全是1。 這個超平面可以用分類函式表示,當f(x)等於0的時候,x便是位於超平面上的點,而f(x)大於0的點對應y=1的資料點,f(x)小於0的點對應y=-1的點,如下圖所示:

換言之,在進行分類的時候,遇到一個新的資料點x,將x代入f(x)中,如果f(x)小於0則將x的類別賦為-1,如果f(x)大於0則將x的類別賦為1。

接下來的問題是,如何確定這個超平面呢?從直觀上而言,這個超平面應該是最適合分開兩類資料的直線。而判定“最適合”的標準就是這條直線離直線兩邊的資料的間隔最大。所以,得尋找有著最大間隔的超平面。

1.2函式間隔與幾何間隔

在超平面w*x+b=0確定的情況下,|w*x+b|能夠表示點x到距離超平面的遠近,而通過觀察w*x+b的符號與類標記y的符號是否一致可判斷分類是否正確,所以,可以用(y*(w*x+b))的正負性來判定或表示分類的正確性。於此,我們便引出了函式間隔(functionalmargin)的概念。定義函式間隔(用表示)為:

而超平面(w,b)關於T中所有樣本點(xi,yi)的函式間隔最小值(其中,x是特徵,y是結果標籤,i表示第i個樣本),便為超平面(w,b)關於訓練資料集T的函式間隔:

=mini (i=1,...n)

但這樣定義的函式間隔有問題,即如果成比例的改變w和b(如將它們改成2w和2b),則函式間隔的值f(x)卻變成了原來的2倍(雖然此時超平面沒有改變),所以只有函式間隔還遠遠不夠。

事實上,我們可以對法向量w加些約束條件,從而引出真正定義點到超平面的距離--幾何間隔(geometricalmargin)的概念。

假定對於一個點x,令其垂直投影到超平面上的對應點為x0,w是垂直於超平面的一個向量,為樣本x到分類間隔的距離,如下圖所示:

有,其中||w||表示的是範數。

又由於x0是超平面上的點,滿足f(x0)=0,代入超平面的方程即可算出:

為了得到的絕對值,令乘上對應的類別y,即可得出幾何間隔(用表示)的定義:

1.3最大間隔分類器

對一個數據點進行分類,當超平面離資料點的“間隔”越大,分類的確信度(confidence)也越大。所以,為了使得分類的確信度儘量高,需要讓所選擇的超平面能夠最大化這個“間隔”值。這個間隔如下圖中的gap/2所示。 通過由前面的分析可知:函式間隔不適合用來最大化間隔值,因為在超平面固定以後,可以等比例地縮放w的長度和b的值,這樣可以使得的值任意大,亦即函式間隔可以在超平面保持不變的情況下被取得任意大。但幾何間隔因為除上了,使得在縮放w和b的時候幾何間隔的值是不會改變的,它只隨著超平面的變動而變動,因此,這是更加合適的一個間隔。換言之,這裡要找的最大間隔分類超平面中的“間隔”指的是幾何間隔。 於是最大間隔分類器(maximummarginclassifier)的目標函式可以定義為: 同時需滿足一些條件,根據間隔的定義,有 回顧下幾何間隔的定義可知:如果令函式間隔等於1(之所以令等於1,是為了方便推導和優化,且這樣做對目標函式的優化沒有影響)則有=1/||w||且,從而上述目標函式轉化成了: 這個目標函式便是在相應的約束條件下,最大化這個1/||w||值,而1/||w||便是幾何間隔。 如下圖所示,中間的實線便是尋找到的最優超平面(Optimal Hyper Plane),其到兩條虛線的距離相等,這個距離便是幾何間隔,兩條虛線之間的距離等於2,而虛線上的點則是支援向量。由於這些支援向量剛好在邊界上,所以它們滿足(還記得我們把 functional margin 定為 1 了嗎?上節中:處於方便推導和優化的目的,我們可以令=1),而對於所有不是支援向量的點,則顯然有。 2深入理解SVM 2.1從原始問題到對偶問題的轉化: 接著考慮之前得到的目標函式: 由於求的最大值相當於求的最小值,所以上述目標函式等價於(w由分母變成分子,從而也有原來的max問題變為min問題,很明顯,兩者問題等價):

因為現在的目標函式是二次的,約束條件是線性的,所以它是一個凸二次規劃問題。這個問題可以用現成的QP(QuadraticProgramming)優化包進行求解。一言以蔽之:在一定的約束條件下,目標最優,損失最小。此外,由於這個問題的特殊結構,還可以通過拉格朗日對偶性(Lagrange Duality)變換到對偶變數(dualvariable)的優化問題,即通過求解與原問題等價的對偶問題(dualproblem)得到原始問題的最優解,這就是線性可分條件下支援向量機的對偶演算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函式,進而推廣到非線性分類問題。那什麼是拉格朗日對偶性呢?簡單來講,通過給每一個約束條件加上一個拉格朗日乘子(Lagrangemultiplier),定義拉格朗日函式(通過拉格朗日函式將約束條件融合到目標函式裡去,從而只用一個函式表示式便能清楚的表達出我們的問題):

然後令:

容易驗證,當某個約束條件不滿足時,例如,那麼顯然有(只要令即可)。而當所有約束條件都滿足時,則最優值為,亦即最初要最小化的量。

因此,在要求約束條件得到滿足的情況下最小化,實際上等價於直接最小化(當然,這裡也有約束條件,就是0,i=1,,n) ,因為如果約束條件沒有得到滿足,會等於無窮大,自然不會是我們所要求的最小值。具體寫出來,目標函式變成了:

這裡用表示這個問題的最優值,且和最初的問題是等價的。如果直接求解,那麼一上來便得面對w和b兩個引數,而又是不等式約束,這個求解過程不好做。不妨把最小和最大的位置交換一下,變成:

交換以後的新問題是原始問題的對偶問題,這個新問題的最優值用來表示。而且有≤,在滿足某些條件的情況下,這兩者相等,這個時候就可以通過求解對偶問題來間接地求解原始問題。 換言之,之所以從minmax的原始問題,轉化為maxmin的對偶問題,一者因為是的近似解,二者,轉化為對偶問題後,更容易求解。下面可以先求L對w、b的極小,再求L對的極大。

2.2KTT條件

上文中提到“≤在滿足某些條件的情況下,兩者等價”,這所謂的“滿足某些條件”就是要滿足KKT條件。一般地,一個最優化數學模型能夠表示成下列標準形式:

其中,f(x)是需要最小化的函式,h(x)是等式約束,g(x)是不等式約束,p和q分別為等式約束和不等式約束的數量。

同時,得明白以下兩點:

  • 凸優化的概念:為一凸集,為一凸函式。凸優化就是要找出一點,使得每一滿足。
  • KKT條件的意義:它是一個非線性規劃(Nonlinear Programming)問題能有最優化解法的必要和充分條件。

而KKT條件就是指上面最優化數學模型的標準形式中的最小點x*必須滿足下面的條件:

附加:拉格朗日乘子法和KTT條件原理解釋:http://www.cnblogs.com/zhangchaoyang/articles/2726873.html

2.3對偶問題的求解方法

(1)、首先固定要讓L關於w和b最小化,我們分別對w,b求偏導數,即令L/w和L/b等於零(對w求導結果的解釋請看本文評論下第45樓回覆):

將以上結果代入之前的L

得到:

求對的極大,即是關於對偶問題的最優化問題。經過上面第一個步驟的求w和b,得到的拉格朗日函式式子已經沒有了變數w,b,只有。從上面的式子得到:

這樣,求出了,根據,即可求出w,然後通過將支援向量帶入原方程,即可求出b,最終得出分離超平面和分類決策函式。

2.4線性不可分的情況

OK,為過渡到下節2.2節所介紹的核函式,讓我們再來看看上述推導過程中得到的一些有趣的形式。首先就是關於我們的 hyper plane ,對於一個數據點x進行分類,實際上是通過把x帶入到算出結果然後根據其正負號來進行類別劃分的。而前面的推導中我們得到

因此分類函式為:

這裡的形式的有趣之處在於,對於新點x的預測,只需要計算它與訓練資料點的內積即可(表示向量內積),這一點至關重要,

是之後使用 Kernel 進行非線性推廣的基本前提。此外,所謂 Supporting Vector 也在這裡顯示出來——事實上,所有非Supporting Vector 所對應的係數都是等於零的,

因此對於新點的內積計算實際上只要針對少量的“支援向量”而不是所有的訓練資料即可。

為什麼非支援向量對應的等於零呢?直觀上來理解的話,就是這些“後方”的點——正如我們之前分析過的一樣,對超平面是沒有影響的,由於分類完全有超平面決定,所以這些無關的點並不會參與分類問題的計算,因而也就不會產生任何影響了。

2.5核函式

特徵空間的隱式對映:核函式

咱們首先給出核函式的來頭:在上文中,我們已經瞭解到了SVM處理線性可分的情況,而對於非線性的情況,SVM 的處理方法是選擇一個核函式 κ(⋅,⋅) ,通過將資料對映到高維空間,來解決在原始空間中線性不可分的問題。此外,因為訓練樣例一般是不會獨立出現的,它們總是以成對樣例的內積形式出現,而用對偶形式表示學習器的優勢在為在該表示中可調引數的個數不依賴輸入屬性的個數,通過使用恰當的核函式來替代內積,可以隱式得將非線性的訓練資料對映到高維空間,而不增加可調引數的個數(當然,前提是核函式能夠計算對應著兩個輸入特徵向量的內積)。線上性不可分的情況下,支援向量機首先在低維空間中完成計算,然後通過核函式將輸入空間對映到高維特徵空間,最終在高維特徵空間中構造出最優分離超平面,從而把平面上本身不好分的非線性資料分開。如圖7-7所示,一堆資料在二維空間無法劃分,從而對映到三維空間裡劃分:

而在我們遇到核函式之前,如果用原始的方法,那麼在用線性學習器學習一個非線性關係,需要選擇一個非線性特徵集,並且將資料寫成新的表達形式,這等價於應用一個固定的非線性對映,將資料對映到特徵空間,在特徵空間中使用線性學習器,因此,考慮的假設集是這種型別的函式:

這裡ϕ:X->F是從輸入空間到某個特徵空間的對映,這意味著建立非線性學習器分為兩步:
  1. 首先使用一個非線性對映將資料變換到一個特徵空間F,
  2. 然後在特徵空間使用線性學習器分類。
而由於對偶形式就是線性學習器的一個重要性質,這意味著假設可以表達為訓練點的線性組合,因此決策規則可以用測試點和訓練點的內積來表示: 如果有一種方式可以在特徵空間中直接計算內積φ(xi·φ(x),就像在原始輸入點的函式中一樣,就有可能將兩個步驟融合到一起建立一個非線性的學習器,這樣直接計演算法的方法稱為核函式方法: 核是一個函式K,對所有x,z(-X,滿足,這裡φ是從X到內積特徵空間F的對映。 2.6核函式如何處理非線性資料 來看個核函式的例子。如下圖所示的兩類資料,分別分佈為兩個圓圈的形狀,這樣的資料本身就是線性不可分的,此時咱們該如何把這兩類資料分開呢(下文將會有一個相應的三維空間圖)? 事實上,上圖所述的這個資料集,是用兩個半徑不同的圓圈加上了少量的噪音生成得到的,所以,一個理想的分界應該是一個“圓圈”而不是一條線(超平面)。 如果用X1和X2來表示這個二維平面的兩個座標的話,我們知道一條二次曲線(圓圈是二次曲線的一種特殊情況)的方程可以寫作這樣的形式: 注意上面的形式,如果我們構造另外一個五維的空間,其中五個座標的值分別為Z1=X1,Z2=X21,Z3=X2,Z4=X22,Z5=X1X2,那麼顯然,上面的方程在新的座標系下可以寫作: 關於新的座標Z,這正是一個 hyper plane 的方程!也就是說,如果我們做一個對映ϕ:R2R5,將X按照上面的規則對映為Z,那麼在新的空間中原來的資料將變成線性可分的, 從而使用之前我們推導的線性分類演算法就可以進行處理了。這正是Kernel方法處理非線性問題的基本思想。 再進一步描述 Kernel 的細節之前,不妨再來看看這個例子對映過後的直觀例子。 當然,你我可能無法把 5 維空間畫出來,不過由於我這裡生成資料的時候就是用了特殊的情形,具體來說,我這裡的超平面實際的方程是這個樣子(圓心在X2軸上的一個正圓): 對映之後就可以分了: 核函式相當於把原來的分類函式: 對映成: 而其中的可以通過求解如下 dual 問題而得到的:

這樣一來問題就解決了嗎?似乎是的:拿到非線性資料,就找一個對映,然後一股腦把原來的資料對映到新空間中,再做線性 SVM 即可。

不過事實上沒有這麼簡單!其實剛才的方法稍想一下就會發現有問題:在最初的例子裡,我們對一個二維空間做對映,選擇的新空間是原始空間的所有一階和二階的組合,得到了五個維度;

如果原始空間是三維,那麼我們會得到 19 維的新空間,這個數目是呈爆炸性增長的,這給的計算帶來了非常大的困難,而且如果遇到無窮維的情況,就根本無從計算了。所以就需要 Kernel 出馬了。

不妨還是從最開始的簡單例子出發,設兩個向量和,而即是到前面說的五維空間的對映,因此對映過後的內積為:

另外,我們又注意到:

二者有很多相似的地方,實際上,我們只要把某幾個維度線性縮放一下,然後再加上一個常數維度,具體來說,上面這個式子的計算結果實際上和對映

之後的內積的結果是相等的,那麼區別在於什麼地方呢?

  1. 一個是對映到高維空間中,然後再根據內積的公式進行計算;
  2. 而另一個則直接在原來的低維空間中進行計算,而不需要顯式地寫出對映後的結果

回憶剛才提到的對映的維度爆炸,在前一種方法已經無法計算的情況下,後一種方法卻依舊能從容處理,甚至是無窮維度的情況也沒有問題。

我們把這裡的計算兩個向量在隱式對映過後的空間中的內積的函式叫做核函式(Kernel Function) ,例如,在剛才的例子中,我們的核函式為:

核函式能簡化對映空間中的內積運算——剛好“碰巧”的是,在我們的SVM 裡需要計算的地方資料向量總是以內積的形式出現的。對比剛才我們上面寫出來的式子,現在我們的分類函式為: 其中由如下 dual 問題計算而得: 這樣一來計算的問題就算解決了,避開了直接在高維空間中進行計算,而結果卻是等價的!當然,因為我們這裡的例子非常簡單,所以我可以手工構造出對應於的核函數出來,如果對於任意一個對映,想要構造出對應的核函式就很困難了。 2.7使用鬆弛變數處理 outliers 方法 在本文第一節最開始討論支援向量機的時候,我們就假定,資料是線性可分的,亦即我們可以找到一個可行的超平面將資料完全分開。 後來為了處理非線性資料,在上文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 問題現在寫作:

3 SMO演算法

在上文中,我們提到了求解對偶問題的序列最小最優化SMO演算法,但並未提到其具體解法。首先看下最後懸而未決的問題:

等價於求解:

3.1SMO演算法的推導

咱們首先來定義特徵到結果的輸出函式:

注:這個u與我們之前定義的實質是一樣的。

接著,重新定義下咱們原始的優化問題,權當重新回顧,如下:

求導得到:

代入中,可得

通過引入拉格朗日乘子轉換為對偶問題後,得:

經過加入鬆弛變數後,模型修改為:

從而最終我們的問題變為:

下面要解決的問題是:在上求上述目標函式的最小值。為了求解這些乘子,每次從中任意抽取兩個乘子和,然後固定和以外的其它乘子,

使得目標函式只是關於和的函式。這樣,不斷的從一堆乘子中任意抽取兩個求解,不斷的迭代求解子問題,最終達到求解原問題的目的。

而原對偶問題的子問題的目標函式可以表達為:

其中:

為了解決這個子問題,首要問題便是每次如何選取和。實際上,其中一個乘子是違法KKT條件最嚴重的,另外一個乘子則由另一個約束條件選取。

根據KKT條件可以得出目標函式中取值的意義:

這裡的還是拉格朗日乘子:

  1. 對於第1種情況,表明是正常分類,在邊界內部(我們知道正確分類的點);
  2. 對於第2種情況,表明了是支援向量,在邊界上;
  3. 對於第3種情況,表明了是在兩條邊界之間;

而最優解需要滿足KKT條件,即上述3個條件都得滿足,以下幾種情況出現將會出現不滿足:

  • <=1但是<C則是不滿足的,而原本=C
  • >=1但是>0則是不滿足的,而原本=0
  • =1但是=0或者=C則表明不滿足的,而原本應該是0<<C

也就是說,如果存在不滿足KKT條件的,那麼需要更新這些,這是第一個約束條件。此外,更新的同時還要受到第二個約束條件的限制,

因此,如果假設選擇的兩個乘子和,它們在更新之前分別是、,更新之後分別是、,那麼更新前後的值需要滿足以下等式才能保證和為0的約束:

其中,是常數。

兩個因子不好同時求解,所以可先求第二個乘子的解(),得到的解()之後,再用的解()表示的解()。

為了求解,得先確定的取值範圍。假設它的上下邊界分別為H和L,那麼有:

接下來,綜合和這兩個約束條件,求取的取值範圍。

當y1!=y2時,根據可得,所以有,,如下圖所示:

當y1=y2時,同樣根據可得:,所以有,,如下圖所示:

如此,根據y1和y2異號或同號,可得出的上下界分別為:

回顧下第二個約束條件,令上式兩邊乘以y1,可得:其中,

因此可以用表示,,從而把子問題的目標函式轉換為只含的問題:

對求導,可得:

化簡下:然後將,,代入上式可得:

令(表示預測值與真實值之差),,然後上式兩邊同時除以,得到一個關於單變數的解:

這個解沒有考慮其約束條件,即是未經剪輯時的解。 然後考慮約束可得到經過剪輯後的的解析解為:
  • 對於,即第一個乘子,可以通過剛剛說的那3種不滿足KKT的條件來找;
  • 而對於第二個乘子可以尋找滿足條件 :的乘子。

而b在滿足下述條件:

下更新b:

且每次更新完兩個乘子的優化後,都需要再重新計算b,及對應的Ei值。 最後更新所有,y和b,這樣模型就出來了,從而即可求出咱們開頭提出的分類函式: