注:最近在工做中,高頻率的接觸到了SVM模型,並且還有使用SVM模型作迴歸的狀況,即SVR。另外考慮到本身從第一次知道這個模型到如今也差很少兩年時間了,從最開始的騰雲駕霧到如今有了一點直觀的認識,花費了很多時間。所以在這裏作個總結,比較一下使用同一個模型作分類和迴歸之間的差異,也記念一下與SVM相遇的兩週年!這篇總結,不會涉及太多公式,只是但願經過可視化的方法對SVM有一個比較直觀的認識。html
因爲代碼比較多,沒有放到正文中,全部代碼均可以在github中:linkgit
原始SVM算法是由弗拉基米爾·萬普尼克和亞歷克塞·澤範蘭傑斯於1963年發明的。1992年,Bernhard E. Boser、Isabelle M. Guyon和弗拉基米爾·萬普尼克提出了一種經過將核技巧應用於最大間隔超平面來建立非線性分類器的方法。當前標準的前身(軟間隔)由Corinna Cortes和Vapnik於1993年提出,並於1995年發表。github
上個世紀90年代,因爲人工神經網絡(RNN)的衰落,SVM在很長一段時間裏都是當時的明星算法。被認爲是一種理論優美且很是實用的機器學習算法。算法
在理論方面,SVM算法涉及到了很是多的概念:間隔(margin)、支持向量(support vector)、核函數(kernel)、對偶(duality)、凸優化等。有些概念理解起來比較困難,例如kernel trick和對偶問題。在應用方法,SVM除了能夠當作有監督的分類和迴歸模型來使用外,還能夠用在無監督的聚類及異常檢測。相對於如今比較流行的深度學習(適用於解決大規模非線性問題),SVM很是擅長解決複雜的具備中小規模訓練集的非線性問題,甚至在特徵多於訓練樣本時也能有很是好的表現(深度學習此時容易過擬合)。可是隨着樣本量$m$的增長,SVM模型的計算複雜度會呈$m^2$或$m^3$增長。網絡
在下面的例子中,均使用上一篇博客中提到的鳶尾屬植物數據集。機器學習
圖1:Iris data set函數
感知機能夠看作是低配版的線性SVM,從數學上能夠證實:學習
在線性可分的兩類數據中,感知機能夠在有限步驟中計算出一條直線(或超平面)將這兩類徹底分開。優化
若是這兩類距離越近,所需的步驟就越多。此時,感知機只保證給出一個解,可是解不惟一,以下圖所示:spa
圖2:感知機訓練出來的3個不一樣的線性分類器
訓練樣本$x \in \mathbb{ R }^{n}$,標籤$y \in {-1, 1}$,對於線性分類器來講:
參考上面的描述,在分類正確的狀況下,若是一個點$x$的標籤爲$y = 1$,預測值$w \cdot x + b > 0$,分類爲1;標籤爲-1,預測值小於0,分類爲-1. 那麼可使用$y (w \cdot x + b) > 0 $來統一表示分類正確的狀況,反之可使用$y(w \cdot x + b) < 0$來表示分類錯誤的狀況。
在分類正確時,即$y (w \cdot x + b) > 0$,$loss = 0$;
在分類錯誤時,即$y (w \cdot x + b) \leq 0$,$loss = -y (w \cdot x + b)$.
利用隨機梯度降低的方式訓練模型,每次只使用一個樣本,根據代價函數的梯度更新參數,
step1: 初始化$w = 0, b = 0$;
step2: 循環從訓練集取樣本,每次一個
if $y (w \cdot x + b) \leq 0$(該樣本分類錯誤):
w = w + yx
b = b + y
從流程上來看,每次取出一個樣本點訓練模型,並且只在分錯的狀況下更新參數,最終全部樣本都分類正確時,模型訓練過程結束。
在兩類樣本線性可分的狀況下,感知機能夠保證找到一個解,徹底正確的區分這兩類樣本。可是解不惟一,並且這些決策邊界的質量也不相同,直觀上來看這條線兩邊的間隔越大越好。那麼有沒有一種方法能夠直接找到這個最優解呢?這就是線性SVM所作的事情。
從直觀上來看,約束條件越多對模型的限制也就越大,所以解的個數也就越少。感知機的解不惟一,那麼給感知機的代價函數加上更強的約束條件好像就能夠減小解的個數。事實上也是這樣的。
在分類正確時,即$y (w \cdot x + b) > 1$,$loss = 0$;
在分類錯誤時,即$y (w \cdot x + b) \leq 1$,$loss = -y (w \cdot x + b)$.
比較一下能夠發現,原來$w \cdot x + b$只須要大於0或小於0就能夠了,可是如今須要大於1或小於1. 在這裏爲何選擇1我尚未很直觀的解釋,可是有一點很是重要:原來的決策邊界只是一條直線,如今則變成了一條有寬度的條帶。原來差別很是小的兩個點(例如$w \cdot x + b = 0$附近的兩個點)就能夠被分紅不一樣的兩類,可是如今至少要相差$\frac{2}{||w||}$才能夠,以下圖所示。
圖3:設樣本屬於兩個類,用該樣本訓練SVM獲得的最大間隔超平面。在超平面上的樣本點也稱爲支持向量。
圖3來自wiki,爲了統一塊兒見,下面仍是將決策邊界定義爲$w \cdot x + b = 0$,兩邊的邊界(兩條虛線)分別爲$w \cdot x + b = 1$和$w \cdot x + b = 1$,此時只是b的符號不一樣其餘性質都相同. 其中$w, b$就是模型訓練時須要優化的參數。由上面的示意圖能夠獲得如下信息:
下面是計算兩條虛線之間距離的過程:
將決策邊界的向量表示$w·x + b = 0$展開後能夠獲得,$w1*x1 + w2*x2 + b = 0$.
轉化成截距式能夠獲得,$x2 = - w1/w2 * x1 - b/w2$,所以其斜率爲$-w1/w2$, 截距爲$-b/w2$
直線的方向向量爲,$(1, -w1/w2)$(能夠取x=1, b=0時,獲得y的值)
直線的法向量爲$w = (w1, w2)$
所以,對於直線$w \cdot x + b = 1$來講,截距式爲$x2 = - w1/w2 * x1 + (1 - b)/w2$,至關於沿着$x2$軸向上平移了$\frac{1}{w_2}$,計算可得該直線與$w \cdot x + b = 0$沿法向量方向的距離爲$\gamma = \sqrt{\frac{1}{w_1^2 + w_2^2}} = \frac{1}{||w||}$,參考圖4.
圖4:margin的寬度$\gamma$
在SVM中,優化的目標就是最大化margin的寬度$\gamma$,由於$\gamma = \frac{1}{||w||}$,其中$||w||$是待優化參數$w$的模長。所以優化目標等價於最小化$||w||$,能夠表示爲爲:
對於$(x^{(1)}, y^{(1)}), \ ..., \ (x^{(m)}, y^{(m)}) \in \mathbb{R^d} \times \{-1, 1\}$,$\min_{w \in \mathbb{R}^d, b \in \mathbb{R}}||w||^2$
s.t. $y^{(i)}(w \cdot x^{(i)} + b) ≥ 1$對於全部的$i = 1, 2, ..., m$成立
下面是分別使用感知機和SVM對鳶尾屬數據集中setosa這一類和非setosa進行分類的效果比較:
圖5:感知機線性分類器
圖6:線性SVM的分類效果
比較圖5和圖6能夠看到,SVM肯定的決策邊界周圍的margin更大一些,所以對更多未知的樣本進行分類時,在邊界上的一些點能夠獲得更準確的分類結果。
在圖1中能夠看到,setosa這一類與其餘兩類是線性可分的,可是virginica這一類與與之相鄰的versicolor有一些點是重合的,也就是說是線性不可分的。此時仍然可使用SVM來進行分類,原理是在代價函數中加入了一個鬆弛變量(slack) $\xi$,
對於$(x^{(1)}, y^{(1)}), \ ..., \ (x^{(m)}, y^{(m)}) \in \mathbb{R^d} \times \{-1, 1\}$,$\min_{w \in \mathbb{R}^d, b \in \mathbb{R}}||w||^2 + C\sum_{i=1}^{m}{\xi^i} $
s.t. $y^{(i)}(w \cdot x^{(i)} + b) ≥ 1 - \xi_i$對於全部的$i = 1, 2, ..., m$成立
上面的優化目標加入鬆弛變量後,就能夠容許必定程度的違反兩邊的邊界(由上式中的C來控制),容許必定的錯誤分類,從而將兩類原來線性不可分的兩類數據分開。
下面是$C=1000$時,對virginica和非virginica的分類效果:
圖8:加入鬆弛變量後的SVM分類效果
C做爲SVM模型的超參數之一,須要從一個較大的範圍中一步一步的篩選,直到找到最適合的C。C值越大,表示錯誤分類的代價越大,就越趨於拒絕錯誤分類,即hard margin;C值越小,表示錯誤分類的代價越小,就越能容忍錯誤分類,即soft margin。即便是在線性可分的狀況下,若是C設置的很是小,也可能致使錯誤分類的出現;在線性不可分的狀況下,設置過大的C值會致使訓練沒法收斂。
支持向量迴歸模型(Support Vector Regression, SVR)是使用SVM來擬合曲線,作迴歸分析。分類和迴歸問題是有監督機器學習中最重要的兩類任務。與分類的輸出是有限個離散的值(例如上面的$\{-1, 1\}$)不一樣的是,迴歸模型的輸出在必定範圍內是連續的。下面再也不考慮不一樣鳶尾花的類型,而是使用花瓣的長度(至關於自變量x)來預測花瓣的寬度(至關於因變量y)。
下圖中從全部150個樣本中,隨機取出了80%做爲訓練集:
圖9:訓練SVR模型的訓練樣本
下面是使用線性SVR訓練出來的迴歸線:
圖10:SVR模型訓練出來的迴歸線
與SVM是使用一個條帶來進行分類同樣,SVR也是使用一個條帶來擬合數據。這個條帶的寬度能夠本身設置,利用參數$\epsilon$來控制:
圖11:SVR模型迴歸效果示意圖,其中帶紅色環的點表示支持向量
在SVM模型中邊界上的點以及兩條邊界內部違反margin的點被當作支持向量,而且在後續的預測中起做用;在SVR模型中邊界上的點以及兩條邊界之外的點被當作支持向量,在預測中起做用。按照對偶形式的表示,最終的模型是全部訓練樣本的線性組合,其餘不是支持向量的點的權重爲0. 下面補充SVR模型的代價函數的圖形:
圖12:soft margin SVR的代價函數
從圖12中能夠看到,在margin內部的這些點的error都爲0,只有超出了margin的點纔會計算error。所以SVR的任務就是利用一條固定寬度的條帶(寬度由參數$\epsilon$來控制)覆蓋儘量多的樣本點,從而使得總偏差儘量的小。
https://zh.wikipedia.org/wiki/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA
https://zhuanlan.zhihu.com/p/26263309, 直線方程的各類形式
https://github.com/ageron/handson-ml/blob/master/05_support_vector_machines.ipynb
http://www.svms.org/regression/SmSc98.pdf
http://www.robots.ox.ac.uk/~az/lectures/ml/
edx: UCSanDiegoX - DSE220x Machine Learning Fundamentals
https://github.com/OnlyBelter/jupyter-note/blob/master/machine_learning/SVM/04_how%20SVM%20becomes%20to%20SVR.ipynb, 文中代碼