線性可分支持向量機
給定線性可分的訓練數據集,通過間隔最大化或等價地求解相應的凸二次規划問題學習到的分離超平面為
\[w^{\ast }x+b^{\ast }=0 \]以及相應的決策函數
\[f\left( x\right) =sign\left(w^{\ast }x+b^{\ast } \right) \]稱為線性可分支持向量機
如上圖所示,o和x分別代表正例和反例,此時的訓練集是線性可分的,這時有許多直線能將兩類數據正確划分,線性可分的SVM對應着能將兩類數據正確划分且間隔最大的直線。
函數間隔和幾何間隔
函數間隔
對於給定的訓練集和超平面\((w,b)\),定義超平面\((w,b)\)的函數間隔為:
\[\widehat\gamma_{i}=y_{i}(wx_{i}+b) \]
超平面\((w,b)\)關於訓練集T的函數間隔最小值為:
函數間隔可表示分類預測的正確性及確信度,但是成比例改變\(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\|}) \]
上述的幾何間隔通過距離公式也可以計算出來。
定義超平面\((w,b)\)關於訓練集T的幾何間隔為超平面\((w,b)\)關於T中所有樣本點的幾何間隔的最小值:
從函數間隔和幾何間隔的定義中可以看出,函數間隔與幾何間隔有如下關系:
間隔最大化
SVM的基本想法是求解能夠正確划分訓練數據集並且幾何間隔最大的分離超平面。
現在首先假設數據集線性可分,那么這個問題可以表述為下面的約束最優化問題:
考慮函數間隔與幾何間隔的關系,上式可以改寫為:
因為將\(w\)和\(b\)按比例改變對上述最優化問題的約束沒有影響,對目標函數的優化也沒有影響,因此就可以取\(\widehat\gamma=1\),代入上面的最優化問題可以得:
這就是線性可分支持向量機的最優化問題,這是一個凸二次規划問題。
對偶算法
對前面提出的最優化問題構建拉格朗日函數,得到:
首先需要最小化拉格朗日函數。
將拉格朗日函數\(L(w,b,\alpha)\)分別對\(w\)和\(b\)求偏導,得:
得到:
代入到拉格朗日函數得:
即:
然后求\(\min L(w,b,\alpha)\)對\(\alpha\)的極大,即得對偶問題:
將上式的目標函數由求極大轉為求極小,即得:
得到最優化的解為:
由上面兩式可得,\(w^{*}\)和\(b^{*}\)只依賴於訓練數據中對應於\(\alpha^{*}>0\)的樣本點,將這些樣本點成為支持向量。
根據KKT條件可知,支持向量一定在間隔邊界上:
對應於\(\alpha^{*}> 0\)的樣本,有:
即樣本點一定在間隔邊界上,因此在預測的時候只需要使用支持向量就可以了。
Kernels
當遇到分類問題是非線性的時候,就可以使用非線性的SVM來求解,在求解過程中,kernel trick十分的重要。
非線性變換的問題不好解,所以采用一個非線性變換,將非線性問題變換為線性問題,通過解變換后的線性問題來求解原來的非線性問題。
設原空間為\(\chi\subseteq R^{2}\),\(x=((x^{(1)},x^{(2)}))^{T}\),新空間\(Z\subseteqR^{2}\),\(z=(z^{(1)},z^{(2)})^{T}\),定義原空間到新空間的變換為:
然后就可以用新空間的點來求解問題。
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)
- 高斯核函數(Gaussion kernel function)
高斯核函數也叫徑向基核函數(RBF)
在使用了核函數后,最后預測函數變為:
軟間隔支持向量機(soft-margin)
線性可分支持向量機的學習方法對線性不可分的訓練數據是不適用的。線性不可分意味着某些樣本點\((x_{i},y_{i})\)不能滿足函數間隔大於等於1的條件,那么可以引入一個松弛變量\(\xi_{i}\geq0\),這樣約束條件就變為了:
這樣線性不可分的SVM學習問題變成了如下的問題:
這樣拉格朗日函數變為:
分別對\(w、b、\xi\)求偏導,最后得到的對偶問題為:
軟間隔最大化時的支持向量
根據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\)
- 若\(0<\xi_{i}<0\),那么點被分類正確,且在超平面和間隔邊界之間。
- 若\(\xi_{i}=1\),那么點在超平面上,無法分類。
- 若\(\xi_{i}>1\),那么點位於超平面誤分類的一側。
SMO算法
SMO算法用於快速實現SVM,包含兩個部分:求解兩個變量二次規划的解析方法和選擇變量的啟發式方法。
假設固定住\(\alpha_3,\ldots,\alpha_m\),那么優化問題就依賴於\(\alpha_{1}、\alpha_{2}\),此時可以得到:
可得到\(\alpha_{1}、\alpha_{2}\)的約束圖如下:
因為\(y_i\in[-1,1]\),因此上述約束條件可以轉化為:
這樣就可以求得\(\alpha_{2}\)
但是\(\alpha_{2}\)有限制條件,因此可能會被修剪,最終\(\alpha_{2}^{new}\)的取值為:
最后可以根據\(\alpha_{2}^{new}\)計算出\(\alpha_{1}^{new}\)。
變量選擇方法
- SMO選擇第一個變量的過程為外層循環,外層循環在訓練樣本中選取違反KKT條件最嚴重的樣本點。
- SMO選擇第二個變量的過程為內層循環,第二個變量選擇的標准是希望能使\(\alpha_{2}\)有足夠大的變化。
實現
最后我簡單用python實現了下SVM,倉庫地址為:SVM的實現