機器學習算法總結(一)——支持向量機


  自學機器學習三個月,接觸到了各種算法,然而很多知其然而不知其所以然,因此想對過往所學的知識做個總結,該系列的文章不會有過多的算法推導。

  我們知道較早的分類模型——感知機(1957年)是二類分類的線性分類模型,也是后來神經網絡和支持向量機的基礎。支持向量機(Support vector machines)最早也是是一種二類分類模型,經過演進,現在成為了既能處理多元線性

和非線性的問題,也能處理回歸問題。在深度學習風靡之前,應該算是最好的分類算法。但目前SVM的應用仍然很多,尤其是在小樣本集上。

1、感知機模型

  感知機模型是一種二分類的線性分類器,只能處理線性可分的問題,感知機的模型就是嘗試找到一個超平面將數據集分開,在二維空間這個超平面就是一條直線,在三維空間就是一個平面。感知機的分類模型如下:

   

  sign函數是指示函數(當wx+b > 0,f(x) = +1;當wx+b < 0,f(x) = -1 ;感知機的超平面是wx+b = 0

  

  將上述分段函數整合成 y(wx+b) > 0,則滿足該式子的樣本點即分類正確的點,不滿足的即分類錯誤的點,我們的目標就是找到這樣一組參數w,b 使得將訓練集中的正類點和負類點分開。

  

  接下來定義我們的損失函數(損失函數是一種衡量損失和錯誤的程度的函數),我們可以通過定義分類錯誤的樣本的個數來作為損失函數,但是這種損失函數不是參數w,b 的連續可導函數,因此不容易優化。我們知道對於誤分類的點

有-y(wx+b) > 0,我們讓所有的誤分類點到超平面的距離和最小(注意:感知機的損失函數只針對誤分類點,而不是整個訓練集):

   

  其中M是表示誤分類的樣本集合, 當w,b 成倍數增大時,並不會改變我們的超平面,||w||的值也會相應的增大,因此令||w|| = 1 不會影響我們的結果。最終的感知機損失函數如下:

    

2、支持向量機

  在感知機中,我們的目標是將訓練集分開,只要是能將樣本分開的超平面都滿足我們的要求,而這樣的超平面有很多。支持向量機本質上和感知機類似,然而要求卻更加苛刻,我們知道在分類過程中,

那些遠離超平面的點是安全的,而那些容易被誤分類的點是離超平面很近的點,而支持向量機的思想就是要重點關注這些離超平面很近的點,一句話就是在分類正確的同時,讓離超平面最近的點到超平面的間隔最大。

基於上面的感知機我們可以將我們的目標表示為:

  

 

  γ是離超平面最近的點的到超平面的幾何間隔,將幾何間隔用函數間隔替代,可以將式子表示為:

  

  γ(帽子)表示的是函數間隔,而函數間隔的取值是會隨着w,b 成倍數變化而變化的,並不會影響最終的結果,因此令γ(帽子) = 1,則我們最終的問題可以表述為:

  

  在這里引出了支持向量機的第一個亮點:最大化間隔,最大化間隔能使得分類更加精確,且該最大間隔超平面是存在且唯一的。

  

  上面的問題中的 1/2||w||是凸函數,同時約束不等式是仿射函數,因此這是一個凸二次規划問題,根據凸優化理論,我們可以借助拉格朗日函數將我們的約束問題轉化為無約束的問題來求解,我們的優化函數可以表達為:

    

  αi 是拉格朗日乘子,       αi ≥ 0  i = 1, 2, 3, ....., n 。

  根據拉格朗日的對偶性,可以將原始問題轉化為對偶問題(只要對偶問題存在,對偶問題的最優化解就是原問題的最優化解,一般對偶問題都比原始問題更容易求解)極大極小問題:

  

  先對w,b求導求極小問題, 可以得到w,b的值:

  

  將求得的解代入到拉格朗日函數中,可以得到下面的優化函數(將代入后原本的求α 的極大問題轉換成了極小問題):

  

  因此只需要求得我們的α 的值就可以求得我們的w,b 的值(求α 的常用算法是SMO算法 可以參考 https://www.cnblogs.com/pinard/p/6111471.html)假設最終求得的α 的值為α*,則w,b可以表述成:

  

  引入KTT條件(KTT條件是上面拉格朗日函數求最優解的必要條件):

  

  從KTT條件中可以看出,當yi(w*xi + b*) - 1 > 0 時,αi* = 0;當 αi* > 0 時,yi(w*xi + b*) - 1 = 0;

  結合上面的w,b 表達式可以引出支持向量機的第二個亮點:w,b 參數只與滿足 yi(w*xi + b*) - 1 = 0 的樣本有關,而這些樣本點就是離最大間隔超平面最近的點,我們將這些點稱之為支持向量。因此很多時候支持向量在小樣本集分類時也能表現的很好,也正是因為這個原因。(另外需注意:α 向量的個數是和訓練集數量相等的,對與大的訓練集,會導致所需要的參數數量增多,因此SVM在處理大的訓練集時會比其他常見的機器學習算法要慢

3、軟間隔最大化

  通常情況下的訓練集中都會存在一些異常點,而這些異常點會導致訓練集線性不可分,但除去這些異常點之后,剩下的樣本就是線性可分的,而上面講到的硬間隔最大化是無法處理線性不可分的問題,線性不可分意味着有些樣本點的函數間隔是不能滿足

大於等於 1 的約束條件。因此我們對每個樣本(xi, yi)引入一個松弛變量 ξi, 則我們的約束條件變為:

  

  目標函數中加入對松弛變量的懲罰項,懲罰參數C > 0,目標優化函數變為:

  

  因為整個求解的原始問題可以描述為:

  

  采用和之前同樣的求解方法,利用拉格朗日將約束問題轉化為無約束的問題,將原始問題轉化為求極大極小問題的對偶問題,可以得到我們的最終結果:

  

  和第二部分中的結果唯一不同的是αi 的取值范圍多了一個上限C 值,對於軟間隔最大化時,其支持向量描述要復雜一些,因為其支持向量可以在間隔邊界上(如下圖中的虛線),也可以在間隔邊界和超平面之間,或者在分離超平面誤分的一側。

  

 4、合頁損失函數

   合頁損失函數又稱為hinge 損失函數,其表達式如下:

  

  因此我們上面的優化問題可以描述為:

  

  對上述損失函數中的第一項可以理解為當樣本分類正確且間隔大於1,即 yi(wxi + b) ≥ 1時,損失為0;而當 yi(wxi + b) < 1 時,損失為 1 - yi(wxi + b),注意在這里即使樣本分類正確,但是間隔小於1 的也會計入損失,這就是支持向量機的苛刻性

  下圖是hinge損失函數和其他一些損失函數的比較:

  

5、線性不可分

   上面講到的軟間隔最大化只能解決由於異常點而導致的線性不可分問題,而對於本身的數據集就是非線性的問題就無能為力,根據相關理論對於在低維空間線性不可分的問題,一般將其映射到高維空間后都是線性可分的,我們可以將這一理論運用

到支持向量機中,可以引入一個函數 ϕ(x),將樣本集從當前維度映射到更高的維度,回過頭來看我們之前的優化函數:

  

  我們只需要將優化函數中的內積 x · x轉化成 ϕ(xi) · ϕ(xj) 即可解決我們的非線性問題,但與此同時也引入了新的問題我們的數據維度增大后,內積的計算量也增大了,當映射后的維度很高,甚至是達到無窮維之后,求解模型時的計算量也會顯著增大,

那么如何來處理這個問題呢?這就需要引入我們的核函數了。

  我們知道即使在映射到高維后,內積 ϕ(xi· ϕ(xj) 的值也依然是一個常數,那么是否存在這樣一個函數

  K( x· x) = ϕ(xi· ϕ(xj) ,有理論證明當這樣的函數是存在的(Mercer定理已證明),我們將其稱為核函數。

  在此引出了支持向量機的第三個亮點:在不需要將樣本映射到高維空間,而利用核函數解決非線性分類問題 。

  通過借助核函數就解決了我們的問題,當然不是什么函數都能作為核函數的,已經被證明的核函數並不多,而常用的核函數也就那么幾個,接下來我們介紹下常見的幾種核函數:

  1)線性核函數

  線性核函數很好理解,只能用來處理線性問題,其表達式如下:

  

  因此我們可以將線性SVM和非線性SVM放在一起,只需要通過設定核函數和處理它們

  2)多項式核函數

  

  其中的 a,c,d 的值都是需要我們去通過調參設置的。

  3)徑向基核函數

  徑向基核函數也稱為高斯核函數

  

  參數較少,只需要自己去設置參數 σ

  4)Sigmoid 核函數

  K(x, y) = tanh (ax · z + r)

  需要設置調試的參數 a,r, 其中 tanh 函數雙曲正切函數,也被常用來作神經網絡中的激活函數。

  根據泰勒展開式,我們知道高階可導的函數都可以用多項式函數表示,在這里徑向基核函數和Sigmoid核函數都是高階可導的,因此都可以用多項式來表述。換句話說,徑向基核函數和Sigmoid核函數都是可以表述高階多項式的,因此在選擇核函數時,

徑向基核函數和Sigmoid 核函數通常要比多項式核函數表現的要好,因為可以自動的去匹配階數,而不需要我們去指定多項式核函數的階數,此外多項式核函數需要調試的參數也比較多,因此通常選擇徑向基核函數。

6、總結

  總的來說,在集成算法和神經網絡風靡之前,SVM 基本上是最好的分類算法,但即使在今天,它依然占有較高的地位。

  SVM 的主要優點有:

  1)引入最大間隔,分類精確度高

  2)在樣本量較小時,也能准確的分類,並且具有不錯的泛化能力

  3)引入核函數,能輕松的解決非線性問題

  4)能解決高維特征的分類、回歸問題,即使特征維度大於樣本的數據,也能有很好的表現

  SVM 的主要缺點有:

  1)在樣本量非常大時,核函數中內積的計算,求解拉格朗日乘子α 值的計算都是和樣本個數有關的,會導致在求解模型時的計算量過大

  2)核函數的選擇通常沒有明確的指導,有時候難以選擇一個合適的核函數,而且像多項式核函數,需要調試的參數也非常多

  3)SVM 對缺失數據敏感 (好像很多算法都對缺失值敏感,對於缺失值,要么在特征工程時處理好,要么使用樹模型)。  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM