1. 程式人生 > >svm算法介紹

svm算法介紹

這一 條件 htm 不一定 圖形 處理 lan all 理想

在一個理想的分類當中,我們想要用一個超平面來將正類樣本和負類樣本劃分開來。這個超平面的方程為 $\mathbf{w}^T\mathbf{x}+b=0$ 我們希望這個超平面能夠使得劃分更加的魯棒,在圖形上表現為超平面正好位於正類樣本和負類樣本的正中間,運用這種思想,我們引入了svm算法。

為什麽正分類大於等於1而不是0

對於超平面$\mathbf{w}^T\mathbf{x}+b=0$,

分類為正的樣本在平面的一側,滿足$\mathbf{w}^T\mathbf{x}_i+b > 0 , y_i = +1$

分類為負的樣本在平面的另一側,滿足為$\mathbf{w}^T\mathbf{x}_i+b < 0 , y_i = -1$

我們總是能夠找出一個正數t,無論t是0.001,還是1000或者其它的數字, 使得

分類為正的樣本為$\mathbf{w}^T\mathbf{x}_i+b \geq t , y_i = +1$

分類為負的樣本為$\mathbf{w}^T\mathbf{x}_i+b \leq -t , y_i = -1$

然後我們將式子兩邊同時除以t,也就是通過縮放變換

分類為正的樣本為$\mathbf{w’}^T\mathbf{x}_i+b’ \geq 1, y_i = +1$

分類為負的樣本為$\mathbf{w’}^T\mathbf{x}_i+b’ \leq -1 , y_i = -1$

而對於超平面$\mathbf{w}^T\mathbf{x}+b=0$, 和$\mathbf{w’}^T\mathbf{x}+b’=0$,兩者表示的是一個平面。

上面的這些說明解釋了一個問題:我們明明知道分類為正的樣本是大於等於0,分類為負的樣本小於等於0,但是很多推導當中寫成了大於等於+1,小於等於-1。 原因是經過了縮放處理。

經過縮放處理以後,我們下面的式子為了方便依然用符號$\mathbf{w} 和 b 而不是 \mathbf{w’}、b’$。

假如我們把這個問題再深入思考一點,有兩個平面 x+y+z-3=0 和 2x+2y+2z-6=0 表示的是同一個平面,但是代入同一個數字以後,如(2,2,2),得到的結果是不一樣的,一個是3,一個是6. 如果按照這樣算的話的確是不一樣的,但是出現這個的原因是我們的坐標系縮放比例不一樣了,前面那個3假如需要和2比較的話能夠劃分為正類,那麽後面的6就需要和4進行比較能夠劃分為正類。

而我們上面的縮放處理以後,就是把所有得到的結果和1進行比較,並且兩個最近的異類點距離超平面的距離之和為$\frac{2}{\Vert\mathbf{w}\Vert}$,我們的目標函數就是使得這個值最大。 經過一些列處理,我們得到了支持向量最初的優化式子

$\min \limits_{\mathbf{w}, b} \frac{1}{2}{\Vert \mathbf{w} \Vert}^2 $

$s.t. \ y_i(\mathbf{w}^T\mathbf{x}_i+b) \geq 1, i=1,2,…,m $

使用對偶方法和SMO方法進行優化求解

再求解上述的問題的時候,我們要用到一些優化的知識。首先是利用拉格朗日乘子法求它的對偶問題(註:下面不加下標的$\alpha$均為矢量)

$L(\mathbf{w},b, {\alpha}) = \frac{1}{2} {\Vert \mathbf{w} \Vert}^2 + \sum \limits_{i=1}^{m}\alpha_i (1-y_i(\mathbf{w}^T \mathbf{x}_i +b))$

用$L(\mathbf{w},b, \mathbf{\alpha}) $ 對 $\mathbf{w} 和 b$求偏導,並且為0可以得到:

$\mathbf{w} = \sum\limits_{i=1}^{m} \alpha_i y_i \mathbf{x}_i$

$0 = \sum \limits_{i=1}^{m}\alpha_i y_i$

將上面兩個式子帶入拉格朗日函數,

求出對偶問題的如下:

$\max \limits_\alpha \sum\limits_{i=0}^{m} \alpha _i - \frac{1}{2}\sum\limits_{i=1}^m\sum\limits_{j=1}^m\alpha_i \alpha_j y_i y_j \mathbf{x}_i^T \mathbf{x}_j $

$s.t. \sum \limits_{i=1}^{m}\alpha_i y_i = 0$

$\alpha_i \geq 0 , i=1,2,3,…,m$

若求得$\alpha$ 以後,能夠求得$\mathbf{w}和b$,帶入可以得到如下結果:

$f(x)=\mathbf{w}^T \mathbf{x} +b$

$=\sum \limits_{i=1}^{m}\alpha_i y_i \mathbf{x}_i^T x +b$

下面是用序列最小優化算法(Sequential minimal optimization, SMO) 來求解其中的$\alpha$

SMO的思想是這樣的,固定$\alpha_i$之外的其他參數,優化出$\alpha_i$的值,由於固定除$\alpha_i$以外的其它變量的時候,根據公式$\sum \limits_{i=1}^{m}\alpha_i y_i = 0$ 可以唯一確定$\alpha_i$ ,所以我們一次選擇兩個參數$\alpha_i$和$\alpha_j$進行優化,這樣就能夠求出所有的$\alpha$

求b的值的時候,可以根據所有支持向量$y_s f(\mathbf{x}_s)=1$ 這一約束來進行求解。

核函數:

理想情況下,我們的原始空間當中存在一個平面能夠將正類和負類進行劃分,但是實際情況下很難做到。我們可以尋找一個更高維平面,將數據映射到更高維上面進行劃分。 比如在異或問題當中我們沒有辦法在二維平面上面找到一條直線,在這個時候,我們把數據映射到三維,在三維空間當中能夠找到一個平面將數據進行劃分。

所以,當我們對我們的問題重新進行優化的時候,我們想要使用一個函數$\phi 來將 \mathbf{x}_i $映射到高維空間。於是上面的對偶問題變為了這樣:

$\max \limits_\alpha \sum\limits_{i=0}^{m} \alpha _i - \frac{1}{2}\sum\limits_{i=1}^m\sum\limits_{j=1}^m\alpha_i \alpha_j y_i y_j \phi{ (\mathbf{x}_i ) }^T \phi (\mathbf{x}_j) $

但是,映射到高維有一個問題,那就是計算量太大了,這個時候我們想要尋找一個函數$\kappa$在低維上面進行運算,它運算的結果和映射到高維上再進行計算的結果是一樣的。即$\kappa(\mathbf{x}_i, \mathbf{x}_j) =\phi{ (\mathbf{x}_i ) }^T \phi (\mathbf{x}_j) $。幸運的是,我們根據一些條件能夠找到這樣一些函數,這些函數就是核函數。每一個核函數$\kappa$也對應著一種映射$\phi$。

常用的核函數:

線性核 $\kappa(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i^T \mathbf{x}_j$

多項式核 $\kappa(\mathbf{x}_i, \mathbf{x}_j) ={( \mathbf{x}_i^T \mathbf{x}_j )}^d$ $d \geq 1$為多項式的次數

高斯核 $\kappa(\mathbf{x}_i, \mathbf{x}_j) = \exp (-\frac{{\Vert \mathbf{x}_i – \mathbf{x}_j\Vert}^2}{2 \sigma ^2})$ $\sigma >0$為高斯核的帶寬(width)

拉普拉斯核 $\kappa(\mathbf{x}_i, \mathbf{x}_j) = \exp (-\frac{\Vert \mathbf{x}_i – \mathbf{x}_j\Vert }{2 \sigma })$ $\sigma >0$

Sigmoid核 $\kappa(\mathbf{x}_i, \mathbf{x}_j) = tanh(\beta \mathbf{x}_i^T \mathbf{x}_j + \theta) $ tanh為雙曲正切函數 $\beta >0 , \theta <0$

其中線性核表示的是不進行變換,$\mathbf{x}_i^T \mathbf{x}_j$ 就映射為$\mathbf{x}_i^T \mathbf{x}_j$

以二次多項式核為例,我們可以得到它的映射函數:

$\kappa(\mathbf{x}, \mathbf{z}) = (\mathbf{x}^T\mathbf{z})^2$

= $\mathbf{x}^T\mathbf{z}\mathbf{x}^T\mathbf{z}$

= $\left( \sum \limits_{i=1}^{m} x_i z_i \right) \left(\sum \limits_{j=1}^{m} x_j z_j\right)$

= $\sum \limits_{i=1}^{m} \sum \limits_{j=1}^{m}x_i x_j z_i z_j$

= $\sum \limits_{i=1}^{m} \sum \limits_{j=1}^{m}(x_i x_j)( z_i z_j)$

= $\phi(\mathbf{x})^T \phi(\mathbf{z})$

其中$\phi(\mathbf{x}) = \sum \limits_{i=1}^{m} \sum \limits_{j=1}^{m}x_i x_j $

比如一個向量為$(x_1; x_2; x_3)$映射以後變為$(x_1x_1\ ;x_1x_2\ ; x_1x_3 \ ;x_2x_1\ ;x_2x_2 \ ;x_2x_3\ ;x_3x_1\ ;x_3x_2\ ;x_3x_3)$ 把一個3維的向量映射到9維上面。

幸而我們有了核函數,只需要在3維上面進行計算,而不是映射到9維上面然後再進行計算,這節省了很多的計算量。

軟間隔和hinge損失

上面所討論的問題都屬於“硬間隔”,也就是把所有的樣本都分類正確。 在實際過程當中,我們放寬這條限制,不一定讓所有的樣本滿足$\ y_i(\mathbf{w}^T\mathbf{x}_i+b) \geq 1, i=1,2,…,m $ 但是我們還是希望這類樣本越少越好,於是我們對不滿足上面條件的樣本進行懲罰,引入損失函數的概念。

我們利用上面的思想來對我們的目標函數進行優化,能夠推導出來我們的svm算法其實使用的損失函數叫做hinge損失。這一部分內容在我的博客損失函數 svm和Hinge損失小節裏面有介紹。

參考:

支持向量機(三)核函數

《機器學習》 周誌華

svm算法介紹