最近在看Peter Harrington寫的「機器學習實戰」,這是個人學習筆記,此次是第6章:SVM 支持向量機。
支持向量機不是很好被理解,主要是由於裏面涉及到了許多數學知識,須要慢慢地理解。我也是經過看別人的博客理解SVM的。
推薦你們看看on2way的SVM系列:算法
SVM - Support Vector Machine。支持向量機,其含義是經過支持向量運算的分類器。其中「機」的意思是機器,能夠理解爲分類器。
什麼是支持向量呢?在求解的過程當中,會發現只根據部分數據就能夠肯定分類器,這些數據稱爲支持向量。
見下圖,在一個二維環境中,其中點R,S,G點和其它靠近中間黑線的點能夠看做爲支持向量,它們能夠決定分類器,也就是黑線的具體參數。
機器學習
分類器:就是分類函數。函數
線性分類:能夠理解爲在2維空間中,能夠經過一條直線來分類。在p維空間中,能夠經過一個p-1維的超平面來分類。學習
向量:有多個屬性的變量。在多維空間中的一個點就是一個向量。好比 \(x = (x_1, x_2, ..., x_n)\)。下面的\(w\)也是向量。優化
約束條件(subject to) : 在求一個函數的最優值時須要知足的約束條件。spa
向量相乘: \(xw^T = \textstyle \sum_{i=1}^n w_ix_i\).net
內積: \(\langle x,y \rangle = \textstyle \sum_{i=1}^n x_iy_i\)orm
線性分類
在訓練數據中,每一個數據都有n個的屬性和一個二類類別標誌,咱們能夠認爲這些數據在一個n維空間裏。咱們的目標是找到一個n-1維的超平面(hyperplane),這個超平面能夠將數據分紅兩部分,每部分數據都屬於同一個類別。
其實這樣的超平面有不少,咱們要找到一個最佳的。所以,增長一個約束條件:這個超平面到每邊最近數據點的距離是最大的。也成爲最大間隔超平面(maximum-margin hyperplane)。這個分類器也成爲最大間隔分類器(maximum-margin classifier)。
支持向量機是一個二類分類器。blog
非線性分類
SVM的一個優點是支持非線性分類。它結合使用拉格朗日乘子法和KKT條件,以及核函數能夠產生非線性分類器。ip
分類器1 - 線性分類器
是一個線性函數,能夠用於線性分類。一個優點是不須要樣本數據。
classifier 1:
\[ f(x) = xw^T + b \]
\(w\) 和 \(b\) 是訓練數據後產生的值。
分類器2 - 非線性分類器
支持線性分類和非線性分類。須要部分樣本數據(支持向量),也就是\(\alpha_i \ne 0\)的數據。
\(\because\)
\(w = \textstyle \sum_{i=1}^n \alpha_iy_ix_i\)
\(\therefore\)
classifier 2:
\[ f(x) = \textstyle \sum_{i=1}^n \alpha_iy_i K(x_i, x) + b \\ \text{here} \\ \qquad x_i \text{ : training data i} \\ \qquad y_i \text{ : label value of training data i} \\ \qquad \alpha_i \text{ : Lagrange multiplier of training data i} \\ \qquad K(x_1, x_2) = exp(-\frac{\lVert x_1 - x_2 \rVert ^2}{2\sigma^2}) \text{ : kernel function} \\ \]
\(\alpha\), \(\sigma\) 和 \(b\) 是訓練數據後產生的值。
能夠經過調節\(\sigma\)來匹配維度的大小,\(\sigma\)越大,維度越低。
SVM的解決問題的思路是找到離超平面的最近點,經過其約束條件求出最優解。
對於訓練數據集T,其數據能夠分爲兩類C1和C2。
對於函數:\(f(x) = xw^T + b\)
對於C1類的數據 \(xw^T + b \geqslant 1\)。其中至少有一個點\(x_i\), \(f(x_i) = 1\)。這個點稱之爲最近點。
對於C2類的數據 \(xw^T + b \leqslant -1\)。其中至少有一個點\(x_i\), \(f(x_i) = -1\)。這個點稱也是最近點。
上面兩個約束條件能夠合併爲:
\(y_if(x_i) = y_i(x_iw^T + b) \geqslant 1\)。
\(y_i\)是點\(x_i\)對應的分類值(-1或者1)。
求\(w\)和\(b\).
則超平面函數是\(xw^T + b = 0\)。
爲了求最優的f(x), 指望訓練數據中的每一個點到超平面的距離最大。
(解釋1: 這裏須要理解一個事情,根據上圖,咱們能夠給每一個點作一條平行於超平面的平行線(超平行面),所以,這個最大化至關於求最近點到超平面距離的最大化。)
總結,如今咱們的公式是:
Formula 6.1
\[ f(x) = xw^T + b \\ \text{subject to} \\ \qquad y_if(x_i) = y_i(x_iw^T + b) \geqslant 1, i = 1, ..., n \]
幾個訓練腦筋的小問題:
Q: y是否能夠是其它非{-1, 1}的值?
A: 將y值定義爲{-1, 1}是最簡化的方案。你的分類能夠是cat和dog,只要將cat對應到1, dog對應到-1就能夠了。你也能夠將y值定義爲其它數好比: -2, 2或者2, 3之類的,可是這樣就須要修改超平面函數和約束條件,增長了不必的繁瑣,實際上和y值定義爲{-1, 1}是等價的。
Q: 若是兩組數據裏的太近或者太遠,是否是可能就找不到\(xw^T + b = 1\) 和\(xw^T + b = -1\)的這兩個點?
A: 不會。假設能夠找到\(x_iw^T + b = c\) 和 \(x_jw^T + b = -c\). \(c > 0 and c <> 1\)。其超平面函數爲\(xw^T + b = 0\).
上面公式左右同時除以c, 則:
\(x_iw^T / c + b / c = 1\)
\(x_jw^T / c + b / c = -1\)
令:
\(w' = w/c\)
\(b' = b/c\)
有:
\(x_iw'^T + b' = 1\)
\(x_jw'^T + b' = -1\)
能夠找到超平面函數:
\(xw^T + b' = 0\)
所以,老是能夠找到y是{-1, 1}的超平面,若是有的話。
\(f(x)\)爲函數間隔\(\gamma\)。
若是求\(\text{max } yf(x)\),有個問題,就是w和b能夠等比例增大,致使\(yf(x)\)的間隔能夠無限大。所以須要變成求等價的最大幾何間隔:
\[ \bar{\gamma} = \frac{yf(x)}{\lVert w \rVert} \\ \text{subject to} \\ \qquad y_if(x_i) = y_i(x_iw^T + b) \geqslant 1, i = 1, ..., n \]
\(\lVert w \rVert\) : 二階範數,也就是各項目平方和的平方根。 \(\sqrt {\textstyle \sum_{i=1}^n w_i^2}\)
根據上面的解釋,這個問題能夠轉變爲:
\[ \text{max } \frac{1}{\lVert w \rVert} \\ \text{subject to} \\ \qquad y_i(x_iw^T + b) \geqslant 1, i = 1, ..., n \]
再作一次等價轉換:
Formula 6.2
\[ \text{min } \frac{1}{2} \lVert w \rVert ^ 2 \\ \text{subject to} \\ \qquad y_i(x_iw^T + b) \geqslant 1, i = 1, ..., n \]
咱們使用拉格朗日乘子法和KKT條件來求\(w\)和\(b\),一個重要緣由是使用拉格朗日乘子法後,還能夠解決非線性劃分問題。
拉格朗日乘子法和KKT條件能夠解決下面這個問題:
SVM的問題知足使用拉格朗日乘子法的條件。所以問題變成:
Formula 6.3
\[ \underset{\alpha}{max} \text{ } W(\alpha) = \mathcal{L}(w,b,\alpha) = \frac{1}{2} \lVert w \rVert ^ 2 - \textstyle \sum_{i=1}^n \alpha_i(y_i(x_iw^T + b) - 1) \\ \text{subject to} \\ \qquad \alpha_i >= 0, i = 1, ..., n \\ \qquad \textstyle \sum_{i=1}^n \alpha_iy_i = 0 \\ \qquad 1 - y_i(x_iw^T + b) <= 0, i = 1, ..., n \\ \qquad w = \textstyle \sum_{i=1}^n \alpha_iy_ix_i \\ \text{here} \\ \qquad \alpha_i \text{ : Lagrange multiplier of training data i} \\ \]
消除\(w\)以後變爲:
Formula 6.4
\[ \underset{\alpha}{max} \text{ } W(\alpha) = \mathcal{L}(w,b,\alpha) = \textstyle \sum_{i=1}^n \alpha_i - \frac{1}{2} \textstyle \sum_{i,j=1}^n \alpha_i\alpha_jy_iy_jx_i^Tx_j \\ \text{subject to} \\ \qquad \alpha_i >= 0, i = 1, ..., n \\ \qquad \textstyle \sum_{i=1}^n \alpha_iy_i = 0 \\ \qquad \alpha_i(1 - y_i(\textstyle \sum_{j=1}^n \alpha_jy_j \langle x_j,x_i \rangle + b)) = 0, i = 1, ..., n \]
\(\langle x_j,x_i \rangle\)是\(x_j\) 和 \(x_i\)的內積,至關於\(x_ix_j^T\)。
可見使用拉格朗日乘子法和KKT條件後,求\(w,b\)的問題變成了求拉格朗日乘子\(\alpha_i\)和\(b\)的問題。
到後面更有趣,變成了不求\(w\)了,由於\(\alpha_i\)能夠直接使用到分類器中去,而且可使用\(\alpha_i\)支持非線性的狀況(\(xw^T + b\)是線性函數,支持不了非線性的狀況哦)。
以上的具體證實請看:
解密SVM系列(二):SVM的理論基礎
關於拉格朗日乘子法和KKT條件,請看:
深刻理解拉格朗日乘子法(Lagrange Multiplier)和KKT條件
如上圖:點w是一個異常點,致使沒法找到一個合適的超平面,爲了解決這個問題,咱們引入鬆弛變量(slack variable)\(\xi\)。
修改之間的約束條件爲:\(x_iw^T + b >= 1 – \xi_i \qquad \text{for all i = 1, …, n}\)
則運用拉格朗日乘子法以後的公式變爲:
Formula 6.5
\[ \underset{\alpha}{max} \text{ } W(\alpha) = \mathcal{L}(w,b,\alpha) = \textstyle \sum_{i=1}^n \alpha_i - \frac{1}{2} \textstyle \sum_{i,j=1}^n \alpha_i\alpha_jy_iy_jx_jx_i^T \\ \text{subject to} \\ \qquad 0 \leqslant \alpha_i \leqslant C, i = 1, ..., n \\ \qquad \textstyle \sum_{i=1}^n \alpha_iy_i = 0 \\ \qquad \alpha_i(1 - y_i(\textstyle \sum_{j=1}^n \alpha_jy_j \langle x_j,x_i \rangle + b)) = 0, i = 1, ..., n \]
輸入參數:
1996年,John Platt發佈了一個稱爲SMO的強大算法,用於訓練SVM。SMO表示序列最小優化(Sequential Minimal Optimization)。
SMO方法:
概要:SMO方法的中心思想是每次取一對\(\alpha_i\)和\(\alpha_j\),調整這兩個值。
參數: 訓練數據/分類數據/\(C\)/\(\xi\)/最大迭代數
過程:
初始化\(\alpha\)爲0;
在每次迭代中 (小於等於最大迭代數),
- 找到第一個不知足KKT條件的訓練數據,對應的\(\alpha_i\),
- 在其它不知足KKT條件的訓練數據中,找到偏差最大的x,對應的index的\(\alpha_j\),
- \(\alpha_i\)和\(\alpha_j\)組成了一對,根據約束條件調整\(\alpha_i\), \(\alpha_j\)。
不知足KKT條件的公式:
Formula 6.6
\[ \text{(1) } y_i(u_i - y_i) \leqslant \xi \text{ and } \alpha_i < C \\ \text{(2) } y_i(u_i - y_i) \geqslant \xi \text{ and } \alpha_i > 0 \\ here \\ \qquad u_i = \textstyle \sum_{j=1}^n \alpha_jy_j K(x_j, x_i) + b \\ \qquad K(x_1, x_2) = \langle x_1, x_2 \rangle \\ \qquad \xi \text{ : slack variable} \]
調整公式:
Formula 6.7
\[ \alpha_2^{new} = \alpha_2^{old} - \frac{y_2(E_1 - E_2)}{\eta} \\ \alpha_1^{new} = \alpha_1^{old} + y_1y_2(\alpha_2^{old} - \alpha_2^{new}) \\ b_1 = b^{old} - E_1 -y_1(\alpha_1^{new} - \alpha_1^{old})K(x_1, x_1) - y_2(\alpha_2^{new} - \alpha_2^{old})K(x_1, x_2) \\ b_2 = b^{old} - E_2 -y_1(\alpha_1^{new} - \alpha_1^{old})K(x_1, x_2) - y_2(\alpha_2^{new} - \alpha_2^{old})K(x_2, x_2) \\ b = \begin{cases} b_1 & \text{if } 0 \leqslant \alpha_1^{new} \leqslant C \\ b_2 & \text{if } 0 \leqslant \alpha_2^{new} \leqslant C \\ \frac{b_1 + b_2}{2} & \text{otherwise} \end{cases} \\ here \\ \qquad E_i = u_i - y_i \\ \qquad \eta = 2K(x_1, x_2) - K(x_1, x_1) - K(x_2, x_2) \\ \qquad u_i = \textstyle \sum_{j=1}^n \alpha_jy_j K(x_j, x_i) + b \\ \qquad K(x_1, x_2) = \langle x_1, x_2 \rangle \]
具體證實請參照:
解密SVM系列(三):SMO算法原理與實戰求解
根據機器學習的理論,非線性問題能夠經過映射到高維度後,變成一個線性問題。
好比:二維下的一個點\(<x1, x2>\), 能夠映射到一個5維空間,這個空間的5個維度分別是:\(x1, x2, x1x2, x1^2, x2^2\)。
映射到高維度,有兩個問題:一個是如何映射?另一個問題是計算變得更復雜了。
幸運的是咱們可使用核函數(Kernel function)來解決這個問題。
核函數(kernel function)也稱爲核技巧(kernel trick)。
核函數的思想是:
仔細觀察Formula 6.6 和 Formula 6.7,就會發現關於向量\(x\)的計算,老是在計算兩個向量的內積\(K(x_1, x_2) = \langle x_1, x_2 \rangle\)。
所以,在高維空間裏,公式的變化只有計算低維空間下的內積\(\langle x_1, x_2 \rangle\)變成了計算高維空間下的內積\(\langle x'_1, x'_2 \rangle\)。
核函數提供了一個方法,經過原始空間的向量值計算高維空間的內積,而不用管映射的方式。
咱們能夠用核函數代替\(K(x_1, x_2)\)。
核函數有不少種, 通常可使用高斯核(徑向基函數(radial basis function))
Formula 6.8
\[ K(x_1, x_2) = exp(-\frac{\lVert x_1 - x_2 \rVert ^2}{2\sigma^2}) \]
能夠經過調節\(\sigma\)來匹配維度的大小,\(\sigma\)越大,維度越低,好比10。
能夠參照:
解密SVM系列(四):SVM非線性分類原理實驗
支持向量機通俗導論(理解SVM的三層境界)
支持向量機是一個二類分類器。基於SVM如何構建多類分類器,建議閱讀C. W. Huset等人發表的一篇論文"A Comparison of Methods for Multiclass Support Vector Machines"。須要對代碼作一些修改。