轉自:http://www.cnblogs.com/steven-yang/p/5658362.html
基本概念
-
SVM - Support Vector Machine。支持向量機,其含義是通過支持向量運算的分類器。其中“機”的意思是機器,可以理解爲分類器。
什麼是支持向量呢?在求解的過程中,會發現只根據部分數據就可以確定分類器,這些數據稱爲支持向量。
見下圖,在一個二維環境中,其中點R,S,G點和其它靠近中間黑線的點可以看作爲支持向量,它們可以決定分類器,也就是黑線的具體參數。
-
分類器:就是分類函數。
-
線性分類:可以理解爲在2維空間中,可以通過一條直線來分類。在p維空間中,可以通過一個p-1維的超平面來分類。
-
向量:有多個屬性的變量。在多維空間中的一個點就是一個向量。比如
x=(x1,x2,...,xn) 。下面的w 也是向量。 -
約束條件(subject to) : 在求一個函數的最優值時需要滿足的約束條件。
-
向量相乘:
xwT=∑ni=1wixi -
內積:
⟨x,y⟩=∑ni=1xiyi
解決的問題:
-
線性分類
在訓練數據中,每個數據都有n個的屬性和一個二類類別標誌,我們可以認爲這些數據在一個n維空間裏。我們的目標是找到一個n-1維的超平面(hyperplane),這個超平面可以將數據分成兩部分,每部分數據都屬於同一個類別。
其實這樣的超平面有很多,我們要找到一個最佳的。因此,增加一個約束條件:這個超平面到每邊最近數據點的距離是最大的。也成爲最大間隔超平面(maximum-margin hyperplane)。這個分類器也成爲最大間隔分類器(maximum-margin classifier)。
支持向量機是一個二類分類器。 -
非線性分類
SVM的一個優勢是支持非線性分類。它結合使用拉格朗日乘子法和KKT條件,以及核函數可以產生非線性分類器。 -
分類器1 - 線性分類器
是一個線性函數,可以用於線性分類。一個優勢是不需要樣本數據。
classifier 1:
f(x)=xwT+b(1)
w 和b 是訓練數據後產生的值。 -
分類器2 - 非線性分類器
支持線性分類和非線性分類。需要部分樣本數據(支持向量),也就是αi≠0 的數據。
∵
w=∑ni=1αiyixi
∴
classifier 2:
f(x)=∑ni=1αiyiK(xi,x)+bherexi : training data iyi : label value of training data iαi : Lagrange multiplier of training data iK(x1,x2)=exp(−∥x1−x2∥22σ2) : kernel function(2)
α ,σ 和b 是訓練數據後產生的值。
可以通過調節σ 來匹配維度的大小,σ 越大,維度越低。
核心思想
- SVM的目的是要找到一個線性分類的最佳超平面
f(x)=xwT+b=0 。求w 和b 。 - 首先通過兩個分類的最近點,找到
f(x) 的約束條件。 - 有了約束條件,就可以通過拉格朗日乘子法和KKT條件來求解,這時,問題變成了求拉格朗日乘子
αi 和b 。 - 對於異常點的情況,加入鬆弛變量
ξ 來處理。 - 使用SMO來求拉格朗日乘子
αi 和b 。這時,我們會發現有些αi=0 ,這些點就可以不用在分類器中考慮了。 - 驚喜! 不用求
w 了,可以使用拉格朗日乘子αi 和b 作爲分類器的參數。 - 非線性分類的問題:映射到高維度、使用核函數。
詳解
線性分類及其約束條件
SVM的解決問題的思路是找到離超平面的最近點,通過其約束條件求出最優解。
對於訓練數據集T,其數據可以分爲兩類C1和C2。
對於函數:
對於C1類的數據
對於C2類的數據
上面兩個約束條件可以合併爲:
求
則超平面函數是
爲了求最優的f(x), 期望訓練數據中的每個點到超平面的距離最大。
(解釋1: 這裏需要理解一個事情,根據上圖,我們可以給每個點做一條平行於超平面的平行線(超平行面),因此,這個最大化相當於求最近點到超平面距離的最大化。)
總結,現在我們的公式是:
Formula 6.1
幾個訓練腦筋的小問題:
-
Q: y是否可以是其它非{-1, 1}的值?
A: 將y值定義爲{-1, 1}是最簡化的方案。你的分類可以是cat和dog,只要將cat對應到1, dog對應到-1就可以了。你也可以將y值定義爲其它數比如: -2, 2或者2, 3之類的,但是這樣就需要修改超平面函數和約束條件,增加了沒必要的繁瑣,實際上和y值定義爲{-1, 1}是等價的。 -
Q: 如果兩組數據裏的太近或者太遠,是不是可能就找不到
xwT+b=1 和xwT+b=−1 的這兩個點?
A: 不會。假設可以找到xiwT+b=c 和xjwT+b=−c .c>0andc<>1 。其超平面函數爲xwT+b=0 .
上面公式左右同時除以c, 則:
xiwT/c+b/c=1
xjwT/c+b/c=−1
令:
w′=w/c
b′=b/c
有:
xiw′T+b′=1
xjw′T+b′=−1
可以找到超平面函數:
xwT+b′=0
因此,總是可以找到y是{-1, 1}的超平面,如果有的話。
最大幾何間隔(geometrical margin)
如果求
根據上面的解釋,這個問題可以轉變爲:
再做一次等價轉換:
Formula 6.2
求解問題w,b⇔αi,b
我們使用拉格朗日乘子法和KKT條件來求
拉格朗日乘子法和KKT條件可以解決下面這個問題:
- 求一個最優化問題
f(x)
剛好對應我們的問題:min12∥w∥2 - 如果存在不等式約束
gk(x)<=0,k=1,…,q 。
對應subject to 1−yi(xiwT+b)<=0,i=1,...,n - F(x)必須是凸函數。這個也滿足。
SVM的問題滿足使用拉格朗日乘子法的條件。因此問題變成:
Formula 6.3
消除
Formula 6.4
可見使用拉格朗日乘子法和KKT條件後,求
到後面更有趣,變成了不求
以上的具體證明請看:
解密SVM系列(二):SVM的理論基礎
關於拉格朗日乘子法和KKT條件,請看:
深入理解拉格朗日乘子法(Lagrange Multiplier)和KKT條件
處理異常點(outliers)
如上圖:點w是一個異常點,導致無法找到一個合適的超平面,爲了解決這個問題,我們引入鬆弛變量(slack variable)
修改之間的約束條件爲:
則運用拉格朗日乘子法之後的公式變爲:
Formula 6.5
輸入參數:
- 參數
C ,越大表明影響越嚴重。C 應該一個大於0值。其實C 也不能太小,太小了就約束αi 了,比如200。 - 參數
ξ ,對所有樣本數據起效的鬆弛變量,比如:0.0001。
具體證明請看:
解密SVM系列(二):SVM的理論基礎
求解α -
使用SMO方法
1996年,John Platt發佈了一個稱爲SMO的強大算法,用於訓練SVM。SMO表示序列最小優化(Sequential Minimal Optimization)。
SMO方法:
概要:SMO方法的中心思想是每次取一對
參數: 訓練數據/分類數據/
過程:
初始化
α 爲0;
在每次迭代中 (小於等於最大迭代數),
- 找到第一個不滿足KKT條件的訓練數據,對應的αi ,
- 在其它不滿足KKT條件的訓練數據中,找到誤差最大的x,對應的index的αj ,
-αi 和αj 組成了一對,根據約束條件調整αi ,αj 。
不滿足KKT條件的公式:
Formula 6.6
調整公式:
Formula 6.7
具體證明請參照:
解密SVM系列(三):SMO算法原理與實戰求解
最後一步:解決非線性分類
根據機器學習的理論,非線性問題可以通過映射到高維度後,變成一個線性問題。
比如:二維下的一個點
映射到高維度,有兩個問題:一個是如何映射?另外一個問題是計算變得更復雜了。
幸運的是我們可以使用核函數(Kernel function)來解決這個問題。
核函數(kernel function)也稱爲核技巧(kernel trick)。
核函數的思想是:
仔細觀察Formula 6.6 和 Formula 6.7,就會發現關於向量
x 的計算,總是在計算兩個向量的內積K(x1,x2)=⟨x1,x2⟩ 。
因此,在高維空間裏,公式的變化只有計算低維空間下的內積⟨x1,x2⟩ 變成了計算高維空間下的內積⟨x′1,x′2⟩ 。
核函數提供了一個方法,通過原始空間的向量值計算高維空間的內積,而不用管映射的方式。
我們可以用核函數代替K(x1,x2) 。
核函數有很多種, 一般可以使用高斯核(徑向基函數(radial basis function))
Formula 6.8
可以通過調節
可以參照:
解密SVM系列(四):SVM非線性分類原理實驗
支持向量機通俗導論(理解SVM的三層境界)
如何解決多類分類問題
支持向量機是一個二類分類器。基於SVM如何構建多類分類器,建議閱讀C. W. Huset等人發表的一篇論文"A Comparison of Methods for Multiclass Support Vector Machines"。需要對代碼做一些修改。