SVM(支持向量機)
寫在前面的話:
這是我學習ML寫的第一篇blog,爲什麼選擇SVM呢?很簡單——因爲我發現這個算法包含的東西太多了,多到可以單獨寫成一本書。本人是個機器學習小萌新,剛學習到這個算法的時候被幹的一臉懵逼……正是當時打擊導致了我決定一定要寫篇文章,好好捋一捋這個算法。
以下內容均爲筆者在學習該算法過程中的點點滴滴總結(當然少不了各種看書、查資料……)不管怎麼說,總算是寫完了。
如果你是萌新,我希望你在開始看之前,能拿出紙和筆,遇到重要的公式可以記一下。篇幅較長,一次看不完就多看幾次。不求你能全部搞清楚,至少保證每次看都會有收穫。
如果你是大佬,鄙人能力有限~ 文中若有不盡之處,歡迎各位大佬指教。
首先明確我們要解決的問題:
對於一個線性可分的數據集,以下圖爲例:
![image](http://static.javashuo.com/static/loading.gif)
爲了能將兩邊的數據分隔開來,我們需要找到一個能夠將數據分隔開來的平面,這個平面稱爲分隔超平面(也就是分類的決策邊界)。我們決定用這種方式來構建分類器,那麼如果數據點離決策邊界越遠,最後的預測結果也就越可信。
所以我們希望找到同一類別離分隔超平面最近的點,並確保他們離分隔超平面的距離儘可能的遠,這樣就會使我們的預測結果越可信。
(這句話一定要多讀幾遍,第一次讀可能會感覺彆扭,慢慢讀幾遍,仔細想想。你就會明白我們要幹什麼了,通俗點就是我們希望我們的超平面儘可能的完美,不偏向任何一類別,最後到兩邊的邊界等距。)
這裏那些離分隔超平面最近的那些點,就是我們叫做的–支持向量。
我們接下來所做的一切都是爲了最大化支持向量到分隔超平面的距離。
1.定義分類函數:
f(x)=ωTx+b
(其中w是法向量,b是截距)
首先引入類似海維塞德階躍函數(也就是單位階躍函數)作用於分類函數。將數據分爲+1類和-1類,當f(x)>0輸出1,f(x)<0輸出-1。之所以使用+1和-1是爲了方便,如果數據點屬於1類,並且離超平面距離很遠時,y * f(x)會是一個很大的正數。同理,如果數據點屬於-1類,並且離超平面距離很遠時,y * f(x)同樣會是一個很大的正數。
這樣我們就可以通過一個統一的公式來表示間隔或者數據點到超平面的距離,同時不必擔心數據到底屬於-1還是+1類。
2.找出最大間隔——Max(margin)。
在前面我們已經定義了我們的分類函數,也就是我們超平面方程:
ωTx+b=0
爲了使我們的超平面儘可能的完美,首先找到具有最小間隔的點(這些點就是支持向量),一旦找點具有最小間隔的數據點,我們就要對這些點到超平面的距離做最大化。
很自然我們首先需要知道點到超平面的距離:(也就是幾何間隔,可以參考三維空間中點到平面的距離)
![image](http://static.javashuo.com/static/loading.gif)
所以這裏給出數據點到超平面的距離:
magin=∣∣ωTx+b∣∣∥ω∥
其中||w||表示的是範數。(範數是數學中的一種基本概念。在泛函分析中,它定義在賦範線性空間中,並滿足一定的條件,即①非負性;②齊次性;③三角不等式。它常常被用來度量某個向量空間(或矩陣)中的每個向量的長度或大小。)
我們對於一數據點進行分類,當它的margin越大的時候,分類的confidence也就越大。顯然,對於一個包含n個點的數據集,我們指定它的margin爲所有點中距離超平面最近的那個(支持向量到超平面的幾何距離)。於是,爲了使得分類的confidence儘可能的高,我們希望我們所選擇的超平面能夠最大化這個margin。
已知:
magin=∣∣ωTx+b∣∣∥ω∥
,由於我們只需要考慮在邊界上的點的margin最大即可。這裏不防令所有支持向量
∣∣ωTx+b∣∣
=1,這樣就可以通過最大化
|1|∥ω∥
來求解。但是,並非所有的點都等於1。那些離超平面越遠的數據點,其值越大。這樣我們目標函數和約束條件都確定了:
magin=|1|∥ω∥
s.t.
yi(ωTxi+b)≥1.i=1,2,3……n
到目前爲止,我們已經找到了最大間隔,接下來就是求其最優解。
3 求最大間隔(一)———轉化爲凸優化問題
(1)這裏爲了方便理解重新定義目標函數:
max1∥ω∥
s.t.
yi(ωTxi+b)≥1.i=1,2,3……n
我們可以發現求
max1∥ω∥
與求
min12∥ω∥2
是等價的。當然約束條件不變。現在我們的問題就轉化成了一個凸優化問題。對於帶有約束條件的凸優化問題,我們有更好的解決方法。
(2)拉格朗日乘子法解決問題的合理性
本小節主要介紹拉格朗日乘子法的合理性,如果你不感興趣具體過程,可以直接跳到下一節。只需記住這個理論即可。如果你想了解更多,希望下面內容可以幫組到你。
現有一個二維的優化問題:
minf(x,y)
s.t.g(x,y)=c
通過圖像來理解
圖中虛線就是目標函數的等高線,g(x)與等高線的交點就是同時滿足約束條件和目標函數的可行域值。但並不是所有的可行域的值都是最優值。
因爲如果是相交的話,肯定還存在其它的等高線在該等高線的內部或者外部,使得新的等高線與目標函數的交點值更大或者更小。
所以,
只有在相切的時候纔可能取得最優值。此時,目標函數和約束條件函數梯度共線。既有:
▽[f(x,y)+λ(g(x,y)−c))]=0
通過上式可以構造函數:
F(x,y)=f(x,y)+λ(g(x,y)−c))
顯然,滿足條件的點亦是
minF(x,y)=f(x,y)+λ(g(x,y)−c))
的解。所以新方程
F(x,y)
在到達極值時,與
f(x,y)
到達極值時相等,因爲此時
g(x,y)−c
總等於0。
這裏要特別說明一點:雖然我們這裏等式約束,原始問題是不等式約束條件,實質上這兩者並沒有本質區別。因爲通過圖像我們可以發現,不管是等式約束還是不等式約束,它們都是隻有在與等高線相切時纔有可能取得最優值。
以上就是利用拉格朗日解決帶有約束條件問題的合理性,下面回到我們的問題。
(3)不等式約束條件下的優化問題。
首先根據我們(1)中的目標函數構建一個拉格朗日函數:
L(ω,b,α)=12∥ω∥2−∑ni=1αi(yi(ωTx+b)−1)
s.t.
αi≥0,yi(ωTxi+b)≥1.i=1,2,3……n
原約束條件不變,至於這裏新加的
α
要大於0也很好理解,因爲現在我們要求最小值的函數爲:
12∥ω∥2=maxL(ω,b,α)
。爲了使
L(ω,b,α)
取得最大值,這裏的
α
如果小於0的話,顯然不可能取得最大值。
所以現在我們的目標函數就變成如下形式:
minω,bmaxαi≥0L(ω,b,α)
下面我們將此問題轉化爲對偶問題求解。至於爲什麼這樣做,一方面是因爲對偶問題求解往往更容易。另一方面是因爲kernel,通過對偶之後得到一個向量內積的形式
<x(i),x(j)>
,這種形式是kernel所擅長處理的,進而推廣到非線性分類問題(這一方面的問題在後面後講到)。
現在令:
p∗=minω,bmaxαi≥0L(ω,b,α)
d∗=maxαi≥0minω,bL(ω,b,α)
我們有:
minω,bL(ω,b,α)≤L(ω,b,α)≤maxαi≥0L(ω,b,α)
maxαi≥0minω,bL(ω,b,α)≤minω,bmaxαi≥0L(ω,b,α)
故有
d∗≤p∗
總是成立的,我們把這叫做弱對偶性。很顯然,如果等號成立時,那麼我們的問題就可以解決了(強對偶)。那麼如何判斷一個問題是否具有強對偶性呢?
KKT條件:
minf(x)
s.t.
hi(x)=0,i=1,2,3...m
gj(x)≤0,j=1,2,3...n
其中,f(x)是需要最小化的函數,h(x)是等式約束,g(x)是不等式約束,m和n分別爲等式約束和不等式約束的數量。
KKT條件的意義:
它是一個非線性規劃(Nonlinear Programming)問題能有最優化解法的必要和充分條件。
那到底什麼是所謂Karush-Kuhn-Tucker條件呢?KKT條件就是指上面最優化數學模型的標準形式中的最小點 x* 必須滿足下面的條件:
1.hi(x)=0,i=1,2,3...m,gj(x)≤0,j=1,2,3...n
2.▽f(x∗)+▽∑mi=1λihi(x∗)+▽∑nj=1αjgj(x∗)=0
3.λi≠0,αj≥0,αjgj(x∗)=0
可以發現我們的原始問題滿足此條件,等號成立。
可能會有同學想知道,爲什麼滿足KKT條件,等號就會成立? 之前我們已經說過,問題的最優解一定是邊界上的點,觀察KKT條件發現
αjgj(x∗)=0
。這就說明了
x∗
如果是邊界點的話,那麼
gj(x∗)=0
。如果
x∗
不是邊界點的話,那麼
αj
=0。這就說明了無論
x∗
是不是邊界點,只要滿足最優解時:
f(x∗)=構成的拉格朗日函數L(ω,b,α)
始終成立,因爲此時構成的拉格朗日函數其他項都爲0。
前面已經說明了我們要求的函數:
minω,bmaxαi≥0L(ω,b,α)=minω,b12∥ω∥2
而當滿足KKT條件時,
L(ω,b,α)=12∥ω∥2
所以有:
minω,bL(ω,b,α)=minω,b12∥ω∥2
可以發現此時函數已經與
α
無關,所以
maxαiminω,bL(ω,b,α)=minω,b12∥ω∥2
。至此,我們強對偶條件成立:
maxαiminω,bL(ω,b,α)=minω,bmaxαi≥0L(ω,b,α)
接下來就是
首先固定
α
,要讓
L
關於
ω,b
最小化,然後求對
α
的極大,最後利用SMO算法求解對偶因子。即是關於對偶問題的解,也是原問題的解(這裏要說明一下,SVM問題裏面都是滿足KKT條件的,所以SVM裏面求取對偶解就相當於求原問題的解。)
4 求最大間隔(二)———分三步求解
在上面我們已經把我們的原始問題轉化爲了對偶問題,下面我們的目的就是求出對偶問題求的解,這樣我們的原始問題就解決了。這裏說的分三步求解在前面已經提到了。1.固定
α
,要讓
L
關於
ω,b
最小化。2.求對
α
的極大。3.利用SMO算法求解對偶因子。接下來我們就針對這3步,層層擊破。
拉格朗日函數:
L(ω,b,α)=12∥ω∥2−∑ni=1αi(yi(ωTx+b)−1)
目標函數:
maxαi≥0minω,bL(ω,b,α)
s.t.
αi≥0,yi(ωTxi+b)≥1.i=1,2,3……n
1.固定
α
,要讓
L
關於
ω,b
最小化。
分別對
ω,b
求偏導,並令其等於0:
∂L∂ω=0⇒ω=∑i=1nαiyixi;
∂L∂b=0⇒∑i=1nαiyi=0;
把這兩個等式代入到上面的
L(ω,b,α)
,得到:
L(ω,b,α)=12ωTω−(ωT∑i=1nαiyixi+b∑i=1nαiyi−∑i=1nαi)=∑i=1nαi−12∑i=1n∑j=1nαiαjyiyj<xi,xj>
這裏的
αiyi
都是實數,所以
ωT=∑ni=1αiyixTi
。
<xi,xj>
表示的是兩個向量的內積。(
<xi,xj>=xTixj
)。注意此時的拉格朗只包含了一個變量
α
,只要我們求出
α
,根據上面的兩個等式,便能求出
ω,b
。
2.求此時
L
關於
α
的極大,即是關於對偶問題的解,也是我們原問題的解。
maxαi≥0(∑i=1nαi−12∑i=1n∑j=1nαiαjyiyj<xi,xj>)
s.t
αi≥0,i=1,2...n;∑i=1nαiyi=0
3.SMO(序列最小最優化算法)
SMO算法是一種啓發式算法,其基本思路是:如果所有變量的解都滿足此最優化問題的KKT條件,那麼這個最優化問題的解就得到了。
到這裏我需要暫停一下:因爲到目前爲止我們一直都是針對線性分類問題來處理的。但是我們的生活中往往很多問題並不是這麼友好,更多的是非線性問題分類,當然還可能存在噪音。這就要求我們的算法足夠強大。所以我們就需要引進kernel(核函數),這也正是我們在之前說到過的,將原始問題轉化爲對偶問題求解的好處之一。
所以這節暫時不介紹SMO算法的細節,因爲完整的SMO算法已經把kernel融合進去了,而且內容較多,不適宜在這裏詳解。現在你只要腦海中有這個印象,當我們把原始問題通過KKT判定,成功轉化爲對偶問題之後。就可以用SMO算法來解決我們的對偶問題,進而得到原問題的解。
關於SMO算法的具體實現會在第7節中會詳細介紹,下面的第5節和第6節主要介紹的是非線性數據分類和含有outliers數據分類情況,目的是使我們的SVM更加健壯。
5 從線性分類到非線性分類——Kernel
(高能預警!!! 本節內容可能較多,加上kernel的博大精深,筆者只能把自己瞭解的內容儘可能的描述明白~如有不到之處,望各位大佬不吝賜教)
(1) 引入kernel的契機
爲了過渡到下面我們講到的核函數,我們再來回顧一下前面我們推導得到內容。我們已經有了分類函數
f(x)=ωTx+b
,那麼對於一個新的數據點
X
分類的時候,我麼把
X
代入到這個函數中算出結果,並根據正負號來進行類別的劃分。而且前面已經知道
ω=∑ni=1αiyixi
。這樣我們就得到了:
f(x)=(∑i=1nαiyixi)Tx+b=∑i=1nαiyi<xi,x>+b
注意上面的式子,這裏面有很重要的一點。那就是對於新點
X
的預測,我們只需要計算它與訓練數據點的內積即可(
<xi,x>
)。這點是非常重要的,因爲這是之後使用kernel進行非線性推廣的基本前提。另外還有,所謂的「支持向量機」也在這裏很友好的體現出來了:
實際上,所有非支持向量所對應的係數
α
都是等於0的。因此對於新點的內積計算實際上只需要針對少量的「支持向量」,而不是所有的訓練數據。
爲什麼非支持向量對應的
α
等於0呢?其實這一點在之前我們已經分析過了,這裏就再說一下。從我們的直觀上來理解,我們選擇一個最優的超平面其實只跟那些支持向量(邊界上的點)有關,至於在支持向量後方的點對我們超平面的選擇沒有影響。當然,從之前的目標函數也可以證實這一點:
maxL(ω,b,α)=max12∥ω∥2−∑ni=1αi(yi(ωTx+b)−1)
如果
x
是支持向量的話,
(yi(ωTx+b)−1)
等於1,所以後面那部分就是0。如果
x
不是支持向量的話,
(yi(ωTx+b)−1)
大於1,而
α
又是大於等於0的,爲了滿足最大化,所以
α
必須等於0。
到目前爲止,我們的SVM只能處理線性分類問題。下面將介紹通過kernel推廣到非線性分類的問題,同時說明核函數的強大之處!
(2)核函數Kernel
在上文中,我們已經瞭解到SVM處理線性可分的情況,而對於非線性的情況,SVM的處理方法是選擇一個核函數
k(⋅,⋅)
,通過將數據映射到高維空間,來解決在原始空間中不可分的問題。由於核函數的優良品質,這樣的非線性擴展在計算上並沒有比原來複雜太多,這是很重要的一點。當然,這主要還是因爲核函數,除了SVM之外,任何計算表示爲數據點的內積的方法,都可以使用核函數進行非線性擴展。
簡單來說就是,在線性補不可分的情況下。支持向量機通過某種事先選擇的非線性映射(也就是核函數)將輸入變量映射到了一個高維特徵空間,在這個空間中構造最優分類超平面。我們使用SVM進行數據集分類工作的過程首先是用預先選定好的(核函數)非線性映射將輸入空間映射到搞維特徵空間(如下圖:很清晰的表達了通過映射到高維特徵空間,而把原始空間上本身不好分的非線性數據分開了)。
使得在高維空間中可以通過線性訓練數據實現超平面的分割,避免了在原始空間進行非線性曲面分隔計算。這得益於SVM數據集形成的分類函數具有這樣的性質:分類函數的表達式僅和支持向量的數量有關,而獨立與空間的維度,這樣在處理高維輸入空間的分類時非常有效。
在我們遇到核函數之前,如果使用原始的方法,那麼在用線性學習器學習一個非線性關係時,需要選擇一個非線性特徵集,並且將數據寫成新的表達形式,這等價於應用一個固定的非線性映射,將數據映射到特徵空間,在特徵空間中使用線性學習器。因此,分類器可能就是這種類型的函數:
f(x)=ωTϕ(x)+b
這裏的
ϕ
: 表示的是從輸入空間到某個特徵空間的非線性映射。
這就意味着我們的非線性學習分類器需要兩個步驟:首先要使用一個非線性映把數據變換到一個特徵空間F,然後在特徵空間使用線性學習器分類。
參考線性分類器,此時我們的對於一個數據點
X
的預測表達式爲:
f(x)=∑i=1nαiyi<ϕ(xi),ϕ(x)>+b
觀察上面的式子發現,
如果有一種方式可以在特徵空間中直接計算內積
<ϕ(xi),ϕ(x)>
,就像在原始函數中輸入一樣,那麼就有可能將上面的兩個步驟融合到一起。
於是,核函數誕生了,這樣直接計算的方法稱爲核函數方法。
核是一個函數K(. , .),對於所有的
x1
,
x2
滿足:
K(x1,x2)=<ϕ(x1),ϕ(x2)>
,其中
ϕ
是從
x
到特徵空間的映射。
(3) 核函數:如何處理非線性數據
前面我們已經介紹了線性情況下的支持向量機,它通過尋找一個線性的超平面來達到對數據進行分類的目的。不過,由於是線性的方法,所以對非線性的數據就沒有辦法處理。舉個例子來說,如下圖所示的兩類數據,這樣的數據本身就線性不可分的,此時我們該如何把這兩類數據分開呢?
其實我們可以發現,圖中的數據集是用兩個半徑不同的圓圈加上少量的噪音生成得到的。所以,一個理想的分界應該是一個「圓圈」而不是一條直線。如果用
x1
和
x2
來表示這個二維平面的兩個座標的話,我們知道一條二次曲線的方程可以寫作下面的形式:(圓是二次曲線的一種特殊情況)
a1x1+a2x21+a3x2+a4x22+a5x1x2+a6=0
注意上面的形式,如果我們構造另外一個五維空間,其中五個座標分別爲
z1=x1,z2=x21,z3=x2,z4=x22,z5=x1x2
,那麼顯然,上面的方程在新的空間座標系下可以寫作:
∑i=15aizi+a6=0
關於新的座標
z
,這正是一個超平面方程。也就是說,只要我們做一個映射
ϕ:R2→R5
,將
x
按照上面的規則映射爲
z
,那麼在新的空間中原來的數據將變成線性可分的,從而使用我們之前推導的線性分類算法就可以處理了。
這正是kernel方法處理非線性問題的基本思想。
當然我們無法把映射之後的5維空間畫出來,不過我們可以類似的把它映射到3維空間看一下效果:純屬爲了方便大家理解!
(下圖是在網上找的例子。採用的數據用了特殊情況:數據集和分隔超平面都是圓心在
x2
軸上的一個圓圈。
z1=x21,z2=x22,z3=x2
)
![image](http://static.javashuo.com/static/loading.gif)
通過上圖很明顯地看出,數據是可以通過一個平面分隔開來的。
好了,現在讓我們回到SVM的情形,如果原始的數據是非線性的,我們通過一個映射
ϕ
將其映射到一個高維空間中,數據變得線性可分了,這個時候,我們就可以使用原來的推導來進行計算,只是所有的推導是在新的空間,而不是原始空間中。當然,推導過程也不是可以簡單的直接類比的,例如,原本我們原始空間中的超平面法向量
ω
映射到新的空間的維度是無窮維的,要表示一個無窮維的向量描述起來就比較麻煩了(比如:高斯核 Gaussian Kernel,筆者能力有限,這裏就不多做介紹,有興趣的大佬可以自己研究下~),不過這不影響我們的推導,我們來回憶一下我們沒有引入kernel之前的分類函數是這樣的:
f(x)=∑i=1nαiyi<xi,x>+b
現在則是映射之後的空間,即爲:
f(x)=∑i=1nαiyi<ϕ(xi),ϕ(x)>+b
而且其中的
α
也是通過之前提到的SMO算法求解得到:
maxα∑i=1nαi−12∑i=1n∑j=1nαiαjyiyj<ϕ(xi),ϕ(xj)>
s.t.
αi≥0,i=1,2...n;∑i=1nαiyi=0
這樣一來好像我們的問題都解決了。不管我拿到是什麼數據,線性直接處理。非線性就找一個映射
ϕ
,然後直接把原來的數據映射到新的空間中,再做線性SVM就可以了。是的,原理上這樣是沒有問題的。但是其實並沒有那麼簡單,我們現在想一下剛纔我們舉的例子:我們對一個二維空間做映射的時候,選擇新的空間是原始空間的所有一階和二階的組合,得到了5個維度;那麼如果是三維空間的話,我們就會得到一個19維的新空間。可以看出來這個數目增長是非常恐怖的,這給我們的計算帶來了非常大的困難,而且如果遇到了無窮維的情況,根本沒法計算。
這個時候kernel的價值就體現出來了。我們用簡單的二維空間來說明:設兩個向量
x1=(a1,a2)
,
x2=(b1,b2)
。而
ϕ
就是前面說的到五維空間的映射,所以有:
ϕ(x1)=(a1,a21,a2,a22,a1a2)
,同理對於
x2
一樣。因此得到映射過後的內積爲:
<ϕ(x1),ϕ(x2)>=a1b1+a21b21+a2b2+a22b22+a1a2b1b2
另外我們還有:
(<x1,x2>+1)2=2a1b1+a21b21+2a2b2+a22b22+2a1a2b1b2+1
我們觀察兩者發現有很多相似的地方,實際上我們只把某幾個維度線性縮放一下,然後再加上一個常數維度,完全可以使兩者等價。現在我們改變映射規則
ϕ
。令:
ϕ(x1)=(2√a1,a21,2√a2,a22,2√a1a2,1)
同理對
x2
一樣,那麼此時:
<ϕ(x1),ϕ(x2)>=(<x1,x2>+1)2
很明顯這樣做我們就不用再映射到高維空間中根據內積的公式進行計算,我們可以直接在原來的低維空間中進行計算,而且不需要顯示地寫出映射後的結果。
這樣處理之後,我們之前說到的因爲映射導致維度爆炸增長的問題也解決了。
我們把這裏計算兩個向量在隱式映射過後的空間中的內積函數叫做核函數(Kernel Function)。剛纔的例子中,我們的核函數爲:
K(x1,x2)=(<x1,x2>+1)2
說到這裏大家應該知道爲什麼我們要引進核函數了吧,核函數能簡化映射空間中的內積運算。最舒服的就是在我們的SVM裏需要計算的地方都是以內積的形式出現的。
所以現在我們的分類函數可以爲:
f(x)=∑i=1nαiyiK(xi,x)+b
同樣的對於
α
,可以由SMO算法計算解出:
maxα∑i=1nαi−12∑i=1n∑j=1nαiαjyiyjK(xi,xj)
s.t.
αi≥0,i=1,2...n;∑i=1nαiyi=0
(這裏說明一下
K(x1,x2)=<x1,x2>
,這種核函數稱爲線性核,也就是在原始空間中的內積。這個核函數存在的目的是爲了構造一個通用的表達式。常用的還有多項式核,高斯核……)
這樣一來計算的問題就解決了,避開了直接在高維空間中進行計算,但是結果依然是等價的!!!(激不激動~)當然,這裏爲了大家理解,舉得例子比較簡單,所以我們可以手工構造出對應的核函數
K
,如果對於任意一個映射,想要構造出對應的核函數就不是一件簡單的事了。
最後我們沿着問題來總結一下,核函數到底是怎麼回事?
1.實際生活中我們會遇到很多非線性分類問題,我們常用的方法是把樣例特徵映射到高維空間去,這樣在高位空間中,數據就可以達到線性可分的效果。
2.在第一步我們把特徵映射到高維空間中後,維度會呈爆炸式增長,給我們的計算帶來了很大的問題。這是我們不希望看到的。
3.所以核函數就出現了,核函數的價值在於它雖然也是將樣例特徵從低維到高維的映射,但核函數的最大優點就在於它的計算事先是在低維上進行計算的,然後將實質的分類效果表現在了高維上。這樣就避免了直接在高位空間中的複雜計算。
到此爲止,Kernel就講到這裏,不再深入了……(好吧,我承認是我菜。寫不下去了,再寫下去估計會有人扔磚頭了~後面有機會再更新這部分內容)
6 使用鬆弛變量處理異常值(Outliers)
我們先回顧一下前面的內容:一開始在我們的數據集是線性可分的時候,我們可以找到一個可行的超平面將數據完全分開。後來爲了處理非線性數據,我們引入了kernel方法對原來的線性SVM進行了推廣,使得非線性的情況也能處理。
但是對於有些情況我們還是很難處理,因爲有些問題並不是因爲數據本身是非線性結構,而是因爲數據中存在異常值(我們也叫做噪音)。如下圖所示:對於這種偏離正常位置很遠的數據點,我們稱爲outliers。在我們之前的SVM分類模型裏,outliers的存在有可能造成很大的影響,因爲超平面本身就是由幾個少數的支持向量決定的,如果這些支持向量裏又存在outliers的話,那麼影響就會很大。
如上圖:用黑圈圈起來的那個藍色的點就是一個outliers,它偏離了自己原本應該在的那個空間。如果沒有這個outliers的話,我們的分隔超平面還是比較友好的,但是由於這個outliers的出現,導致我們的分隔超平面發生了改變,變成了圖中黑色虛線的樣子。很明顯,改變之後的分隔超平面的效果並不如之前的超平面。更爲嚴重的是,如果這個outliers再往右上移動一些距離的話,那麼我們將無法構造出能夠將數據分隔開來的超平面。
顯然這種情況並不是我們希望看到的。爲了處理這種情況,SVM允許數據點在一定程度上可以偏離超平面。如上圖中,黑色實線所對應的距離,就是該outliers偏移的距離,如果把它移動回來,這樣我們的超平面就不會發生改變了。
現在回到我們的問題,我們之前的約束條件爲:
yi(ωTxi+b)≥1,i=1,2,...n
現在考慮到outliers,那麼我們的約束條件變爲:
yi(ωTxi+b)≥1−εi,i=1,2,...n
其中
εi
稱爲鬆弛變量(slack variable),代表的就是對應
xi
允許偏移的量。很顯然,如果我們不限制
εi
,
εi
任意大的話,那麼任意的超平面都是符合要求的了。
所以,我們在原來的目標函數後面加上一項,用來限制
εi
,使得這些
εi
的總和也要最小(很講道理的要求:我允許你犯錯,但是你要儘可能把犯錯的可能降到最小)
min12||ω||2+C∑i=1nεi
其中
C
是一個參數,用於控制目標函數中兩項(「尋找最大margin最大的超平面」和「保證數據點偏差量最小」)之間的權重。其中
ε
是需要優化的變量。所以完整寫出來就是這個樣子:
min12||ω||2+C∑i=1nεi
s.t.
yi(ωTxi+b)≥1−εi;εi≥0;i=1,2,...n
同樣是帶有不等式約束的凸優化問題,用之前的方法構造拉格朗日函數如下:
L(ω,b,ε,α,r)=12||ω||2+C∑i=1nεi−∑i=1nαi(yi(ωTxi+b)−1+εi)−∑i=1nriεi
(說明一下:這個地方如果忘記了的小夥伴可以回頭複習一下,前面已經講的足夠詳細了,都是同樣的方法,這裏只是多了個約束條件。下面內容就不做重複的工作了)
同樣,針對這個問題可以像之前一樣操作,轉化爲對偶問題,讓
L
關於
ω,b,ε
最小化:
∂L∂ω=0⇒ω=∑i=1nαiyixi
∂L∂b=0⇒∑i=1nαiyi=0
∂L∂εi=0⇒C−εi−ri=0
把上面得到的式子帶回
L
,我們會得到和原來一樣的目標函數:
maxα∑i=1nαi−12∑i=1n∑j=1nαiαjyiyj<xi,xj>
不過,這裏的約束條件發生了變化。因爲
C−εi−ri=0
,而且有
ri≥0
,所以有
αi≤C
。那麼現在的對偶問題就可以寫作:
maxα∑i=1nαi−12∑i=1n∑j=1nαiαjyiyj<xi,xj>
s.t.
0≤αi≤C,i=1,2,3,...n
∑i=1nαiyi=0
對比前後的結果我們就會發現,這裏唯一的區別就是現在的
α
多了一個上限
C
。(神奇不神奇?對,就是這麼神奇)至於kernel方法的非線性形式也是一樣的,只要把
<xi,xj>
換成
K(xi,xj)
即可。同樣這裏的
α
,也可以由SMO算法計算解出。
這樣一來,你就構造了一個足夠強大,可以處理線性數據和非線性數據並且能夠容忍噪音的SVM!!!
7 SMO(序列最小最優化算法)
好了,終於到了我們的SMO算法了!前面從第4節就介紹到了SMO算法,一直到第5節,第6節我們都是把問題轉換成可以用SMO算法解決的位置就停止了。這樣做的原因一是因爲完整的SMO算法已經包含了前面所有的內容,避免重複工作。二是因爲SMO算法是我們解決問題的最後一個步驟,我們首先把問題都轉化到這一個點上,那麼下面我們只用考慮如何用SMO算法求解即可。
整個SMO算法包括兩個部分:求解兩個變量二次規劃的解析方法和選擇變量的啓發式方法。在前面我們已經說過,KKT條件是該最優化問題的充分必要條件。否則,選擇兩個變量,固定其他變量,針對這兩個變量構建一個二次規劃問題,這個二次規劃問題關於這兩個變量的解應該更接近原始二次規劃問題的解,因爲這會使得原始二次規劃問題的目標函數值變得更小。重要的是,這時子問題可以通過解析方法求解,這樣就可以大大提高整個算法的計算速度。子問題有兩個變量,一個是違反KTT條件最嚴重的那一個,另一個由約束條件自動確定。如此,SMO算法將原問題不斷分解爲子問題並對子問題求解,進而達到求解原問題的目的。
我們需要解決的問題:
minα12∑i=1n∑j=1nαiαjyiyjKi,j−∑i=1nαi
s.t.
0≤αi≤C,i=1,2,3,...n
∑i=1nαiyi=0
其中
Ki,j=K(xi,xj)
,很顯然,通過前兩節的內容你清晰的知道了引入
K
的意義,以及這裏的
α
爲什麼要小於
C
。(當然如果你不知道也沒關係,記住就好了。)
現在我們假設選擇兩個變量是
α1,α2
,其他變量(
i=3,4..n
)是固定的。所以我們SMO的最優化問題可以寫成:
minα1,α2W(α1,α2)=12K11α21+12K22α22+y1y2k12α1α2−(α1+α2)+y1α1∑i=3nyiαiki1+y2α2∑i=3nyiαiki2
s.t.
α1y1+α2y2=−∑i=3nyiαi=S(constant,value)
0≤αI≤Ci=1,2,3...n
注意這裏爲了方便我們省去了不含有
α1,α2
的常數項。
到這裏我們的問題就變成求解兩個變量的二次規劃問題,如下圖:
從圖中可以看出由於約束條件的存在,因此要求的是目標函數在一條平行於對角線的線段上的最優值。而且這裏可以把兩個變量的最優化問題轉化爲單變量的最優化問題(因爲
α1y1+α2y2=S
)。
假設問題的初始可行解爲
αold1,αold2
,最優解爲
αnew1,αnew2
。那麼此時有:
L≤αnew2≤H
其中,
L,H
是
αnew2
所在的對角線端點的值。如果
y1≠y2
(上圖左側所示):
L=max(0,αold2−αold1),H=min(C,C+αold2−αold1)
如果
y1=y2
(上圖右側所示):
L=max(0,αold2+αold1−C),H=min(C,αold2+αold1)
下面爲了敘述方便,引進幾個符號:
g(x)=∑i=1nαiyiK(xi,x)+b
Ei=g(xi)−yi=(∑j=1nαjyjK(xi,xj)+b)−yi,i=1,2
當
i=1,2
時,
Ei
爲函數
g(x)
對輸入點
xi
的預測值與真實值之差。
vi=∑j=3nαjyjK(xi,xj)=g(xi)−∑j=12αjyjK(xi,xj)−b,i=1,2
好了,希望你能暫時記住我們定義的符號。我們上面的問題可以寫作:
W(α1,α2)=12K11α21+12K22α22+y1y2k12α1α2−(α1+α2)+y1α1v1+y2α2v2
已知
α1y1+α2y2=S,y2i=1
,所以可以用
α2
將
α1
表示爲:
α1=(S−α2y2)y1
把這個式子帶回上面的
W(α1,α2)
,就得到只含有
α2
的目標函數:
W(α2)=12K11(S−α2y2)2+12K22α22+y2K12(S−α2y2)α2−(S−α2y2)y1−α2+v1(S−α2y2)+y2α2v2
對
α2
求導:
∂W∂α2=K11α2+K22α2−2K12α2−K11Sy2+K12Sy2+y1y2−1−v1y2+v2y2
爲了得到最優解,令其爲0:
(K11+K22−2K12)α2=y2(y2−y1+SK11−SK12+v1−v2)=
=y2[y2−y1+SK11−SK12+(g(x1)−∑j=12yiαiK1j−b)−(g(x2)−∑j=12yiαiK2j−b)]
將
αold1y1+αold2y2=S
代入,得到:
(K11+K22−2K12)α2=y2[(K11+K22−2K12)αold2y2+y2−y1+g(x1)−g(x2)]=
=(K11+K22−2K12)αold2+y2(E1−E2)
這裏令
η=K11+K22−2K12
,於是就得到:
α2=αold2+y2(E1−E2)η
注意,我們解得的
α2
並不是等價於我們要求的
αnew2
。因爲在這我們並沒有約束條件,但是我們前面已經說到了
αnew2
的取值範圍必須滿足
L≤αnew2≤H
。結合約束條件,我們現在可以給出
αnew2
的正確解:
αnew2=⎧⎩⎨⎪⎪⎪⎪H,αnew2>Hαold2+y2(E1−E2)η,L≤αnew2≤HL,αnew2<L
到此爲止,我們得到了兩個變量二次規劃的求解方法。下面主要的問題就是改如何選擇變量?
1.第一個變量的選擇。
SMO稱選擇第一個變量的過程爲外層循環。外層循環再訓練樣本中選取違反KKT條件最嚴重的樣本點。並且將其對應的變量作爲第1個變量,具體的判斷條件如下:
αi=0⇔yig(xi)≥1
0<αi<C⇔yig(xi)=1
αi=C⇔yig(xi)≤1
其中
g(xi)=∑nj=1αjyjK(xi,xj)+b
該檢驗是在
ε
範圍內進行的,在檢驗過程中,外層循環首先遍歷所有滿足條件
0<αi<C
的樣本點,也就是在間隔邊界上的支持向量點,檢驗他們是否滿足KKT條件。如果這些樣本點都滿足KKT條件,那麼遍歷整個訓練集,檢驗它們是否滿足KKT條件。
2.第二個變量的選擇。
SMO稱選擇第2個變量的過程爲內層循環,假設在外層循環中已經找到第1個變量
α1
,現在要在內層循環找第2個變量
α2
。第2個變量選擇的標準是希望能使
α2
有足夠大的變化。
由上面可知,
αnew2
是依賴於
|E1−E2|
的。爲了加快計算速度,我們就要使
|E1−E2|
最大,因爲
α1
已經確定了,那麼
E1
也就確定了。如果
E1
是正的,那麼就選擇最小的
Ei
作爲
E2
,如果
E1
是負的,那麼就選擇最大的E_{i}
Ei
作爲E_{2}
E2
。當然爲了節省計算時間,我們可以把所有E_{i}