大綱
簡介
支持向量機(support vector machines)是一個二分類的分類模型(或者叫做分類器)。如圖:

它分類的思想是,給定給一個包含正例和反例的樣本集合,svm的目的是尋找一個超平面來對樣本根據正例和反例進行分割。
各種資料對它評價甚高,說“
它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函數擬合等其他機器學習問題中”
SVM之線性分類器
如果一個線性函數能夠將樣本完全正確的分開,就稱這些數據是線性可分的,否則稱為非線性可分的。
什么叫線性函數呢?在一維空間里就是一個點,在二維空間里就是一條直線,三維空間里就是一個平面,以此類推。
如果不關注空間的維數,這種線性函數就是前言中所說的那個統一的名稱——超平面(Hyper Plane)!
在樣本空間中,划分超平面可通過如下線性方程來描述:

假設它已經完成了對樣本的分隔,且兩種樣本的標簽分別是{
+1,-1},那么對於一個分類器來說,g(x)>0和個g(x)<0就可以分別代表兩個不同的類別,+1和-1。
但光是分開是不夠的,SVM的核心思想是
盡最大努力使分開的兩個類別有最大間隔,這樣才使得分隔具有更高的可信度。
而且對於未知的新樣本才有很好的分類預測能力(在機器學習中叫泛化能力)
那么怎么描述這個間隔,並且讓它最大呢?SVM的辦法是:
讓離分隔面最近的數據點具有最大的距離。
為了描述離分隔超平面最近的數據點,需要找到
兩個和這個超平面平行和距離相等的超平面:
H
1
: y =
w
T
x
+ b=+1 和 H
2
: y =
w
T
x
+ b=-1
如圖所示:
在這兩個超平面上的樣本點也就是理論上離分隔超平面最近的點,是它們的存在決定了H1和H2的位置,
支撐起了分界線,它們就是所謂的
支持向量,這就是支持向量機的由來
有了這兩個超平面就可以順理成章的定義上面提到的間隔(margin)了
二維情況下
ax+by=c1和ax+by=c2兩條平行線的距離公式為:

可以推出H1和H2兩個超平面的間隔為2/||w||,即現在的目的是要最大化這個間隔。
所以support vector machine又叫Maximum margin hyper plane classifier
等價於最小化||w||
為了之后的求導和計算方便,進一步等價於最小化

假設超平面能將樣本正確分類,則可令:

兩個式子綜合一下有:

這就是目標函數的約束條件。現在這個問題就變成了一個最優化問題:

而且這是一個凸二次規划問題,一般的解決方法有兩種1是用現成的優化工具包直接求解,2是使用Lagrange Duality找到一種更有效的方法求解。
其中方法2具有兩個優點:
a、更好解
b、可以自然地引入核函數,推廣到非線性分類
所以這里選用了第二種方法。
對偶優化問題
對於上述的最優化問題先需要構造拉格朗日函數:

分別對w和b求導得到:

然后再代入拉格朗日函數后得到原問題的對偶問題:

現在已經完成了對這個問題的建模過程。
當要對一個數據點分類時,只需要把待分類的數據點帶入g(x)中,把結果和正負號對比。又由上面計算得到的w,帶入g(x)得到:

這個式子表示:
對x的預測只需要求它與訓練點的內積,這是用kernal進行線性推廣的基本前提。並且並不是每個訓練點都要用到,只需要用到支持向量,非支持向量的系數a為0。
到這里剩下的是怎么解目前這個最優化問題。
但是目前這分類器還是比較弱的分類器,只適合線性的情況,而且沒什么容錯性。
所以現在先不急着求解,先討論容錯性和非線性情況的推廣(泛化)。
核函數
前述方法對線性不可分的樣本集無能為力。
但是一個低維的樣本集映射到高維則可以變成線性可分(如圖所示),那樣才能使用SVM工作。


設映射函數為
Φ
(
•
),則映射后的空間分類函數變成

但是,如果拿到低維數據直接映射到高維的話,維度的數目會呈現
爆炸性增長。
所以這里需要引入
核函數(kernal function)。
核函數的思想是尋找一個函數,這個函數使得在低維空間中進行計算的結果和映射到高維空間中計算內積
<
Φ
(
x1
),
Φ
(
x2
)>的結果相同。
這樣就避開直接在高維空間中進行計算,而最后的結果卻是等價的。
現在,分類函數就變成了這樣:

其中
就是核函數

由於對任意數據集找到它合適的映射是困難的且沒有必要,所以通常會從常用核函數中選擇。
常用核函數例如:
- 多項式核函數
- 高斯核核函數
- 線性核函數
- 字符串核函數
上述方法叫做
核方法。事實上,任何將計算表示為數據點內積的方法都可以用
核方法進行非線性擴展
容錯性: Outliers
由於噪音的存在,有可能有偏離正常位置很遠的數據點存在,甚至類別1出現雜了類別2的區域中這樣的異常值叫outliers.
為處理這種情況,SVM允許數據點在一定程度上偏離超平面,約束就變成了

其中
,稱為
松弛變量(slack variable)

這就引入了
容錯性
如果
任意大的話,那任意的超平面都是符合條件的了
所以需要在原目標函數中加入
損失函數,可以用


用前者的話,叫
一階軟間隔分類器;用后者的話就叫
二階軟間隔分類器。
還需要一個
懲罰因子C(cost),它代表了對離群點帶來的損失的重視程度,它的值越大,對目標函數的損失越大,意味着你非常不願意放棄這些點。
它是由使用者指定的一個值(libsvm中的參數C),是
參數調優的重點所在。
原來的優化問題就變成了下面這樣:

同樣用Lagrange方法得到對偶問題:

這才是一個可以處理線性和非線性情況並能容忍噪音和outlier的SVM!
SVM用於多類分類
svm本身是一種典型的二分類器,那如何處理現實中的多分類問題呢?
常用的有三種方法:
一、一對多
也就是“一對其余”
(One-against-All) 的方式,
就是每次仍然解一個兩類分類的問題。
這樣對於n個類別會得到n個分類器。
但是這種方式可能會出現分類重疊現象或者不可分類現象
而且由於“其余”的數據集過大,這樣其實就人為造成了“數據偏斜”的問題
二、一對一
每次選擇一個類作為正樣本,負樣本只用選其余的一個類,這樣就避免了數據偏斜的問題。
很明顯可以看出這種方法訓練出的分類個數是k*(k-1)/2,雖然分類器的個數比上面多了,但是訓練階段
所用的總時間卻比“一類對其余”方法少很多。
這種方法可能使多個分類器指向同一個類別,所以可以采用“投票”的方式確定哪個類別:哪個分類器獲得的票數多就是哪個分類器。
這種方式也會有分類重疊的現象,但是不會有不可分類的情況,因為不可能所有類別的票數都是0。
但是也很容易發現這種方法使分類器的數目呈平方級上升。
三、DAG SVM
假設有1、2、3、4、5五個類,那么可以按照如下方式訓練分類器(
這是一個有向無環圖,因此這種方法也叫做DAG SVM)

這種方式減少了分類器的數量,分類速度飛快,而且也沒有分類重疊和不可分類現象。
但是假如一開始的分類器回答錯誤,那么后面的分類器沒有辦法糾正,錯誤會一直向下累積。
為了減少這種錯誤累積,根節點的選取至關重要。
小結
本文從整個流程上理清了SVM是個什么東西
首先,支持向量機是一個十分流行的針對二分類線性分類器,分類的方式是找到一個最優的超平面把兩個類別分開。定義“最優”的方式是使離分隔面最近的數據點到分隔面的距離最大,從而把這個問題轉化成了一個二次優化問題
然后,我們選擇了拉格朗日方法來對這個二次優化問題進行簡化,即轉化成它的對偶問題。雖然我們沒有進一步討論這個優化問題的解法,但這已經形成了SVM的初步模型
隨后我們對這個簡單的分類器進行泛華,用核方法把這個線性模型擴展到非線性的情況,具體方法是把低維數據集映射到高維特征空間。以及,討論了怎么增強分類器的容錯性能。
最后討論了怎么把這個二分類器用於多分類問題。
參考文獻
【1】zouxy09的博客:
http://blog.csdn.net/zouxy09/article/details/17291543
【3】pluskid的博客:
http://blog.pluskid.org/?p=685
【4】《機器學習 》,周志華著
【5】《統計學習方法》,李航著
【6】《機器學習實戰》Peter Harrington著