機器學習實戰 - 讀書筆記(06) – SVM支持向量機

機器學習實戰 - 讀書筆記(06) – SVM支持向量機

前言

最近在看Peter Harrington寫的「機器學習實戰」,這是個人學習筆記,此次是第6章:SVM 支持向量機。
支持向量機不是很好被理解,主要是由於裏面涉及到了許多數學知識,須要慢慢地理解。我也是經過看別人的博客理解SVM的。
推薦你們看看on2way的SVM系列:算法

基本概念

  • SVM - Support Vector Machine。支持向量機,其含義是經過支持向量運算的分類器。其中「機」的意思是機器,能夠理解爲分類器。
    什麼是支持向量呢?在求解的過程當中,會發現只根據部分數據就能夠肯定分類器,這些數據稱爲支持向量。
    見下圖,在一個二維環境中,其中點R,S,G點和其它靠近中間黑線的點能夠看做爲支持向量,它們能夠決定分類器,也就是黑線的具體參數。
    Figure SVM 1機器學習

  • 分類器:就是分類函數。函數

  • 線性分類:能夠理解爲在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的目的是要找到一個線性分類的最佳超平面 \(f(x) = xw^T + b = 0\)。求 \(w\)\(b\)
  • 首先經過兩個分類的最近點,找到\(f(x)\)的約束條件。
  • 有了約束條件,就能夠經過拉格朗日乘子法和KKT條件來求解,這時,問題變成了求拉格朗日乘子\(\alpha_i\)\(b\)
  • 對於異常點的狀況,加入鬆弛變量\(\xi\)來處理。
  • 使用SMO來求拉格朗日乘子\(\alpha_i\)\(b\)。這時,咱們會發現有些\(\alpha_i = 0\),這些點就能夠不用在分類器中考慮了。
  • 驚喜! 不用求\(w\)了,可使用拉格朗日乘子\(\alpha_i\)\(b\)做爲分類器的參數。
  • 非線性分類的問題:映射到高維度、使用核函數。

詳解

線性分類及其約束條件

SVM的解決問題的思路是找到離超平面的最近點,經過其約束條件求出最優解。
Figure SVM 1
對於訓練數據集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}的超平面,若是有的話。

最大幾何間隔(geometrical margin)

\(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 \]

求解問題\(w,b \Leftrightarrow \alpha_i, b\)

咱們使用拉格朗日乘子法和KKT條件來求\(w\)\(b\),一個重要緣由是使用拉格朗日乘子法後,還能夠解決非線性劃分問題。
拉格朗日乘子法和KKT條件能夠解決下面這個問題:

  1. 求一個最優化問題 \(f(x)\)
    恰好對應咱們的問題:\(min \frac{1}{2} \lVert w \rVert ^ 2\)
  2. 若是存在不等式約束\(g_k(x) <= 0, k = 1, …, q\)
    對應 \(\text{subject to } \qquad 1 - y_i(x_iw^T + b) <= 0, i = 1, ..., n\)
  3. F(x)必須是凸函數。這個也知足。

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條件

處理異常點(outliers)

outliers image
如上圖:點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 \]
輸入參數:

  • 參數\(C\),越大代表影響越嚴重。\(C\)應該一個大於0值。其實\(C\)也不能過小,過小了就約束\(\alpha_i\)了,好比200。
  • 參數\(\xi\),對全部樣本數據起效的鬆弛變量,好比:0.0001。
    具體證實請看:
    解密SVM系列(二):SVM的理論基礎

求解\(\alpha\) - 使用SMO方法

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"。須要對代碼作一些修改。

參照

相關文章
相關標籤/搜索