支持向量機(SVM)的推導(線性SVM、軟間隔SVM、Kernel Trick)

線性可分支持向量機

給定線性可分的訓練數據集,經過間隔最大化或等價地求解相應的凸二次規劃問題學習到的分離超平面爲
\[w^{\ast }x+b^{\ast }=0\]
以及相應的決策函數
\[f\left( x\right) =sign\left(w^{\ast }x+b^{\ast } \right)\]
稱爲線性可分支持向量機python

二分類
如上圖所示,o和x分別表明正例和反例,此時的訓練集是線性可分的,這時有許多直線能將兩類數據正確劃分,線性可分的SVM對應着能將兩類數據正確劃分且間隔最大的直線。git

函數間隔和幾何間隔

函數間隔

對於給定的訓練集和超平面\((w,b)\),定義超平面\((w,b)\)的函數間隔爲:
\[\widehat\gamma_{i}=y_{i}(wx_{i}+b)\]github

超平面\((w,b)\)關於訓練集T的函數間隔最小值爲:
\[\widehat\gamma=\min\limits_{i=1,\ldots,m}\widehat\gamma_{i}\]
函數間隔可表示分類預測的正確性及確信度,可是成比例改變\(w\)\(b\),例如將它們變爲\(2w\)\(2b\),超平面並無改變,可是函數間隔卻變爲了原來的2倍,所以能夠對分離超平面的法向量\(w\)加某些約束,如規範化使\(\left\| w\right\|=1\),這時函數間隔就成爲了幾何間隔。算法

幾何間隔

對於給定的訓練集T和超平面\((w,b)\),定義超平面\((w,b)\)關於樣本點\((x_{i},y_{i})\)的幾何間隔爲:
\[\gamma_{i}=y_{i}(\frac{w}{\left\|w\right\|}x_{i}+\frac{b}{\left\|w\right\|})\]ide

上述的幾何間隔經過距離公式也能夠計算出來。
定義超平面\((w,b)\)關於訓練集T的幾何間隔爲超平面\((w,b)\)關於T中全部樣本點的幾何間隔的最小值:
\[\gamma=\min\limits_{i=1,\ldots,m}\gamma_i\]
從函數間隔和幾何間隔的定義中能夠看出,函數間隔與幾何間隔有以下關係:
\[\gamma=\frac{\widehat\gamma}{\left\|w\right\|}\]函數

間隔最大化

SVM的基本想法是求解可以正確劃分訓練數據集而且幾何間隔最大的分離超平面。
如今首先假設數據集線性可分,那麼這個問題能夠表述爲下面的約束最優化問題:
\[\max\limits_{w,b}\quad\gamma\]
\[s.t.\quad y_i(wx_i+b)\geq\gamma\]
\[\left\|w\right\|=1\]學習

考慮函數間隔與幾何間隔的關係,上式能夠改寫爲:
\[\max\limits_{w,b}\quad\frac{\widehat\gamma}{\left\|w\right\|}\]
\[s.t.\quad y_{i}(wx_{i}+b)\geq\widehat\gamma\]優化

由於將\(w\)\(b\)按比例改變對上述最優化問題的約束沒有影響,對目標函數的優化也沒有影響,所以就能夠取\(\widehat\gamma=1\),代入上面的最優化問題能夠得:
\[\min\limits_{w,b}\quad\frac{1}{2}\left\|w\right\|^{2}\]
\[s.t.\quad y_{i}(wx_{i}+b)\geq1,\ i=1,\ldots,m\]
這就是線性可分支持向量機的最優化問題,這是一個凸二次規劃問題。spa

對偶算法

對前面提出的最優化問題構建拉格朗日函數,獲得:
\[L(w,b,\alpha)= \frac{1}{2}\left\|w\right\|^{2}-\sum\limits_{i=1}^{m}\alpha_{i}y_{i}(wx_{i}+b)+\sum\limits_{i=1}^{m}\alpha_{i}\]
首先須要最小化拉格朗日函數。
\[\min L(w,b,\alpha)\]
將拉格朗日函數\(L(w,b,\alpha)\)分別對\(w\)\(b\)求偏導,得:
\[\nabla_{w}L(w,b,\alpha)=w-\sum\limits_{i=1}^{m}\alpha_{i}y_{i}x_{i}=0\]
\[\nabla_{b}L(w,b,\alpha)=-\sum\limits_{i=1}^{m}\alpha_iy_i=0\]
獲得:
\[w=\sum\limits_{i=1}^{m}\alpha_{i}y_{i}x_{i}\]
\[\sum\limits_{i=1}^{m}\alpha_iy_i=0\]
代入到拉格朗日函數得:
\[L(w,b,\alpha)=-\frac{1}{2}\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}^{T}x_{j}+\sum\limits_{i=1}^{m}\alpha_{i}\]
即:
\[\min L(w,b,\alpha)=-\frac{1}{2}\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}^{T}x_{j}+\sum\limits_{i=1}^{m}\alpha_{i}\]
而後求\(\min L(w,b,\alpha)\)\(\alpha\)的極大,即得對偶問題:
\[\max\limits_{\alpha}-\frac{1}{2}\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}^{T}x_{j}+\sum\limits_{i=1}^{m}\alpha_{i}\]
\[s.t.\quad \sum\limits_{i=1}^{m}\alpha_{i}y_{i}=0\]
\[\quad\quad\quad\quad\quad\quad\quad \alpha_{i}\geq0, i=1,2,\ldots,m\]
將上式的目標函數由求極大轉爲求極小,即得:
\[\min\limits_{\alpha}\frac{1}{2}\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}^{T}x_{j}-\sum\limits_{i=1}^{m}\alpha_{i}\]
\[s.t.\quad \sum\limits_{i=1}^{m}\alpha_{i}y_{i}=0\]
\[\quad\quad\quad\quad\quad\quad\quad \alpha_{i}\geq0, i=1,2,\ldots,m\]
獲得最優化的解爲:
\[w^{*}=\sum\limits_{i=1}^{m}\alpha_{i}^{*}y_{i}x_{i}\]
\[b^{*}=y_{j}-\sum\limits_{i=1}^{m}\alpha_{i}^{*}y_{i}x_{i}^{T}x_{j}\]
由上面兩式可得,\(w^{*}\)\(b^{*}\)只依賴於訓練數據中對應於\(\alpha^{*}>0\)的樣本點,將這些樣本點成爲支持向量。
根據KKT條件可知,支持向量必定在間隔邊界上:
\[\alpha^{*}(y_{i}(w^{*}x_{i}+b)-1)=0\]
對應於\(\alpha^{*}> 0\)的樣本,有:
\[y_{i}(w^{*}x_{i}+b)-1=0\]
即樣本點必定在間隔邊界上,所以在預測的時候只須要使用支持向量就能夠了。3d

Kernels

當遇到分類問題是非線性的時候,就可使用非線性的SVM來求解,在求解過程當中,kernel trick十分的重要。
非線性變換的問題很差解,因此採用一個非線性變換,將非線性問題變換爲線性問題,經過解變換後的線性問題來求解原來的非線性問題。
設原空間爲\(\chi\subseteq R^{2}\)\(x=((x^{(1)},x^{(2)}))^{T}\),新空間\(Z\subseteqR^{2}\)\(z=(z^{(1)},z^{(2)})^{T}\),定義原空間到新空間的變換爲:
\[z=\phi(x)=((x^{(1)})^{2},(x^{(2)})^{2})\]
而後就能夠用新空間的點來求解問題。

Kernel Function

\(\chi\)是輸入空間,又設\(H\)爲特徵空間,若是存在一個從\(\chi\)\(H\)的映射:
\[\phi(x):\chi\rightarrow H\]
使得對於所用的\(x,z\subseteq\chi\),函數\(K(x,z)\)知足條件:
\[K(x,z)=\phi(x)^{T}\phi(z)\]
則稱\(K(x,z)\)爲核函數,\(\phi(x)\)爲映射函數。

Kernel Trick

kernel trick是想法是在學習和預測過程當中只定義核函數\(K(x,z)\),而不顯示地定義映射函數\(\phi(x)\)
初學SVM時容易對kernel有一個誤解:覺得是kernel使低維空間的點映射到高維空間後實現了線性可分。
可是實際中kernel實際上是幫忙省去在高維空間裏進行繁瑣計算,它甚至能夠解決無限維沒法計算的問題。
下面給一個例子:

定義一個二次變換:
\[\phi_{2}(x)=(1,x_{1},x_{2},\ldots,x_{d},x_{1}^{2},x_{1}x_{2},\ldots,x_{1}x_{d},x_{2}x_{1},x_{2}^{2},\ldots,x_{2}x_{d},\ldots,x_{d}^{2})\]
上式爲了簡化同時包含了\(x_{1}x_{2}\)\(x_{2}x_{1}\)
能夠求得一個核函數:
\[\phi_{2}(x)^{T}\phi_{2}(z)=1+x^{T}z+(x^{T}z)(x^{T}z)\]
這樣在計算的時候代入核函數求內積比直接用變換後的向量點乘直接求的速度快多了。複雜度也從\(o(d^{2})\)降到了\(o(d)\)

因此不能說是kernel trick完成了低維到高維的變換,kernel trick只是爲這種變換以後的計算服務的一個技巧,真正的變換在定義\(\phi(x)\)的時候已經完成了。

經常使用的kernel function

  • 多項式核函數(polynomial kernel function)
    \[K(x,z)=(1+x^{T}z)^{p}\]
  • 高斯核函數(Gaussion kernel function)
    \[K(x,z)=\exp(-\frac{\left\|x-z\right\|^{2}}{2\sigma^{2}})\]
    高斯核函數也叫徑向基核函數(RBF)
    在使用了核函數後,最後預測函數變爲:
    \[f(x)=sign(\sum\limits_{i=1}^{N^{s}}\alpha_{i}^{*}y_{i}K(x_{i},x)+b^{*})\]

軟間隔支持向量機(soft-margin)

線性可分支持向量機的學習方法對線性不可分的訓練數據是不適用的。線性不可分意味着某些樣本點\((x_{i},y_{i})\)不能知足函數間隔大於等於1的條件,那麼能夠引入一個鬆弛變量\(\xi_{i}\geq0\),這樣約束條件就變爲了:
\[y_{i}(wx_{i}+b)\geq1-\xi_{i}\]
這樣線性不可分的SVM學習問題變成了以下的問題:
\[\min\limits_{w,b,\xi} \frac{1}{2}\left\|w\right\|^{2}+C\sum\limits_{i=1}^{m}\xi_{i}\]
\[s.t. \quad y_{i}(wx_{i}+b)\geq1-\xi_{i}, i=1,\ldots,m\]
\[\xi_{i}\geq0,i=1,\ldots,m\]
這樣拉格朗日函數變爲:
\[L(w,b,\xi,\alpha,\mu)=\frac{1}{2}\left|w\right\|^{2}+C\sum\limits_{i=1}^{m}\xi_{i}-\sum\limits_{i}^{m}\alpha_{i}(y_{i}(wx_{i}+b)-1+\xi_{i})-\sum\limits_{i=1}^{m}\mu_{i}\xi_{i}\]
分別對\(w、b、\xi\)求偏導,最後獲得的對偶問題爲:
\[\min\limits_{\alpha}\frac{1}{2}\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}^{T}x_{j}-\sum\limits_{i=1}^{m}\alpha_{i}\]
\[s.t.\quad \sum\limits_{i=1}^{m}\alpha_{i}y_{i}=0\]
\[\quad\quad\quad\quad\quad\quad\quad 0\leq\alpha_{i}\leq C, i=1,2,\ldots,m\]

軟間隔最大化時的支持向量

根據KKT條件有\(\alpha_{i}^{*}(y_{i}(wx_{i}+b)-1+\xi_{i})=0\)\(\mu_{i}\xi_{i}=0\),又\(\mu_{i}=C-\alpha_{i}\)因此有:

  • 若是\(\alpha=0\)那麼\(y_{i}(wx_{i}+b)\geq1\),此時樣本在間隔邊界或者被正確分類。
  • 若是\(0<\alpha<C\),那麼\(\xi_{i}=0\)\(y_{i}(wx_{i}+b)=1\),點在間隔邊界上。
  • 若是\(\alpha=C\)
    1. \(0<\xi_{i}<0\),那麼點被分類正確,且在超平面和間隔邊界之間。
    2. \(\xi_{i}=1\),那麼點在超平面上,沒法分類。
    3. \(\xi_{i}>1\),那麼點位於超平面誤分類的一側。

SMO算法

SMO算法用於快速實現SVM,包含兩個部分:求解兩個變量二次規劃的解析方法和選擇變量的啓發式方法。
假設固定住\(\alpha_3,\ldots,\alpha_m\),那麼優化問題就依賴於\(\alpha_{1}、\alpha_{2}\),此時能夠獲得:
\[\alpha_{1}y_{1}+\alpha_{2}y_{2}=-\sum\limits_{i=3}^{m}\alpha_{i}y{i}=\zeta\]
可獲得\(\alpha_{1}、\alpha_{2}\)的約束圖以下:
enter image description here
由於\(y_i\in[-1,1]\),所以上述約束條件能夠轉化爲:
\[\alpha_{1}=(\zeta-\alpha_{2}y_{2})y_{1}\]
這樣就能夠求得\(\alpha_{2}\)
可是\(\alpha_{2}\)有限制條件,所以可能會被修剪,最終\(\alpha_{2}^{new}\)的取值爲:
\[\alpha_{2}^{new}=\begin{cases} H & if \quad\alpha_2^{new,unclipped}>H \\ \alpha_2^{new,unclipped} & if \quad L\leq\alpha_2^{new,unclipped}\leq H \\ L & if\quad \alpha_2^{new,unclipped}\leq L \end{cases}\]
最後能夠根據\(\alpha_{2}^{new}\)計算出\(\alpha_{1}^{new}\)

變量選擇方法

  • SMO選擇第一個變量的過程爲外層循環,外層循環在訓練樣本中選取違反KKT條件最嚴重的樣本點。
  • SMO選擇第二個變量的過程爲內層循環,第二個變量選擇的標準是但願能使\(\alpha_{2}\)有足夠大的變化。

實現

最後我簡單用python實現了下SVM,倉庫地址爲:SVM的實現

相關文章
相關標籤/搜索