支持向量機內容特別多,爲了方便閱讀,分成三個部分,上接:
07_支持向量機1_統計學習方法
07_支持向量機2_統計學習方法。
五、SMO算法
KKT條件中的(k4)(k5)還沒有使用過,這兩個條件主要就是用來求解參數α,μ的。但是對於樣本數量和特徵比較多的時候,這麼硬幹是非常耗費內存和時間的。所以在求解參數α時,大牛們使用了更有效的方法——SMO算法(序列最小最優算法),如果沒理解錯的話就是化整爲零,分而治之的思想。
SMO算法是一種啓發式算法,其基本思路是:如果所有變量的解都滿足此最優化問題的KKT條件,那麼這個最優化問題的解就得到了。因爲KKT條件是該最優化問題的充分必要條件。SMO思路,選擇兩個變量,固定其他變量,針對這兩個變量構建一個二次規劃問題,這個二次規劃問題關於這兩個變量的解應該更接近原始二次規劃問題的解,因爲這會使得原始二次規劃問題的目標函數值變得更小。重要的是,這時子問題可以通過解析方法求解,這樣就可以大大提高整個算法的計算速度。子問題有兩個變量,一個是違反KKT條件最嚴重的那一個,另一個由約束條件自動確定。如此,SMO算法將原問題不斷分解爲子問題並對子問題求解,進而達到求解原問題的目的。
非線性支持向量機的優化問題:
αmin s.t. 21i=1∑Nj=1∑NαiαjyiyjK(xi,xj)−i=1∑Nαii=1∑Nαiyi=00≤αi≤C, i=1,2,⋯,N
1、兩個變量二次規劃的求解方法
(1)定義子問題
假設選擇的兩個變量是α1,α2,其他變量αi(i=3,4,⋯,N)是固定的。於是上面非線性支持向量機的優化問題的SMO子問題可以寫成:
α1,α2min W(α1,α2)=21i=1∑Nj=1∑NαiαjyiyjK(xi,xj)−i=1∑Nαi=21i=1∑N(j=1∑2αiαjyiyjK(xi,xj)+j=3∑NαiαjyiyjK(xi,xj))−(α1+α2)−i=3∑Nαi=21i=1∑2(j=1∑2αiαjyiyjK(xi,xj)+j=3∑NαiαjyiyjK(xi,xj))+21i=3∑N(j=1∑2αiαjyiyjK(xi,xj)+j=3∑NαiαjyiyjK(xi,xj))−(α1+α2)−i=3∑Nαi=21i=1∑2j=1∑2αiαjyiyjK(xi,xj)+i=1∑2j=3∑NαiαjyiyjK(xi,xj)+21i=3∑Nj=3∑NαiαjyiyjK(xi,xj)−(α1+α2)−i=3∑Nαi=21K11α12+21K22α22+y1y2K12α1α2+y1α1i=3∑NyiαiKi1+y2α2i=3∑NyiαiKi2−(α1+α2)−i=3∑Nαi+21i=3∑Nj=3∑NαiαjyiyjK(xi,xj)
上式最後兩項爲常數項,對於求解最優的α1,α2毫無作用,捨去,則有SMO對於變量α,α2的子問題可以寫成:
α1,α2min s.t. W(α1,α2)=21K11α12+21K22α22+y1y2K12α1α2+y1α1i=3∑NyiαiKi1+y2α2i=3∑NyiαiKi2−(α1+α2)α1y1+α2y2=−i=3∑Nyiαi=ζ0≤α1≤C,i=1,2 (29) (30) (31)
- Kij=K(xi,xj),i,j=1,2,⋯,N
- ζ是常數
(2)確定變量範圍
由於只有兩個變量(α1,α2),約束可以用二維空間中的圖形表示,如下圖:
二變量優化問題圖示
- 不等式約束(31)使得(α1,α2)在盒子[0,C]×[0,C]內;
- 等式約束(30)使得(α1,α2)在平行於盒子[0,C]×[0,C]的對角線的直線上。
因此要求的是目標函數在一條平行於對角線的線段上的最優值。這使得兩個變量的最優化問題成爲實質上的單變量的最優化問題,不妨考慮爲變量α2的最優化問題。
假設問題(29)-(31)的初始可行解爲α1old,α2old,最優解爲α1new,α2new,並且假設在沿着約束方向未經剪輯時α2的最優解爲α2new,unc,α2剪輯後的解爲α2new。
α2new必須滿足式(31),則α2new的取值範圍必須滿足:
L≤α2new≤H
因爲有式(30),則有:
α1oldy1+α2oldy2=−i=3∑Nyiαi=α1newy1+α2newy2(32)
-
當y1與y2異號時:
α1oldy1y2+α2oldy22=α1newy1y2+α2newy22⟹α2new=α2old−α1old+α1new
又因爲:
0≤α1≤C, 0≤α2≤C
所以有:
L=max(0,α2old−α1old), H=min(C,C+α2old−α1old)
-
當y1與y2同號時:
α1oldy1y2+α2oldy22=α1newy1y2+α2newy22⟹α2new=α2old+α1old−α1new
所以有:
L=max(0,α2old+α1old−C), H=min(C,α2old+α1old)
(3)最優求解
爲了方便書寫,令:
g(x)=j=1∑NαjyjK(x,xj)+bνi=j=3∑NαjyjK(xi,xj)=g(xi)−j=1∑2αjyjK(xi,xj)−bEi=g(xi)−yi=(j=1∑NαjyjK(xi,xj)+b)−yiη=K11+K22−2K12=∣∣ϕ(x1)−ϕ(x2)∣∣2 (w1) (w2) (w3) (w4)
- 當i=1,2時,Ei爲函數g(x)對輸入xi的預測值與真實輸出yi之差。
- ϕ(x)是輸入空間到特徵空間的映射
則目標函數可以寫成:
W(α1,α2)=21K11α12+21K22α22+y1y2K12α1α2+y1α1i=3∑NyiαiKi1+y2α2i=3∑NyiαiKi2−(α1+α2)=21K11α12+21K22α22+y1y2K12α1α2+y1ν1α1+y2ν2α2−(α1+α2)(33)
由α1y1=ζ−α2y2及yi2=1,可將α1表示爲:
α1=(ζ−y2α2)y1
將上式α1代入目標函數(33)得到只含有α2的目標函數:
W(α2)=21K11(ζ−α2y2)2+21K22α22+y2K12(ζ−α2y2)α2+ν1(ζ−α2y2)+y2ν2α2−(ζ−y2α2)y1−α2(34)
上式對α2求導得:
∂α2∂W=K11α2−K11ζy2+K22α2+K12ζy2−2K12α2−ν1y2+y2ν2+y1y2−1
令其爲0,得到:
(K11+K22−2K12)α2=K11ζy2−K12ζy2+ν1y2−y2ν2−y1y2+y22=y2[K11ζ−K12ζ+(g(x1)−j=1∑2αjyjK1j−b)−(g(x2)−j=1∑2αjyjK2j−b)−y1+y2]
將ζ=α1oldy1+α2oldy2代入得到:
(K11+K22−2K12)α2new,unc=y2((K11+K22−2K12)α2oldy2+y2−y1+g(x1)−g(x2))=(K11+K22−2K12)α2old+y2(E1−E2)
將η=K11+K22−2K12=∣∣ϕ(x1)−ϕ(x2)∣∣2代入得到:
α2new,unc=α2old+ηy2(E1−E2)(35a)
則得到剪輯後的α2的解爲:
α2new=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧H,α2new,unc,L,α2new,unc>HL≤α2new,unc≤Hα2new,unc<L(35)
由α2new和等式約束(32)求得α1new是:
α1new=α1old+y1y2(α2old−α2new)
於是得到問題(29)-(31)的解(α1new,α2new)
(4)計算閾值b和差值E
在每次完成兩個變量的優化後,都要重新計算閾值b和差值E。
閾值b更新
當0<α1new<C時,由KKT條件(k3)(k6)(k8)可知:
i=1∑NαiyiKi1+b=y1
於是,
b1new=y1−i=3∑NαiyiKi1−α1newy1K11−α1newy1K11(36)
由E1的定義有
E1=i=3∑NαiyiKi1+α1oldy1K11+α2oldy2K21+bold−y1
則式(36)等號右側的前兩項可寫成:
y1−i=3∑NαiyiKi1=−E1+α1oldy1K11+α2oldy2K21+bold
把上式代入式(36)可得:
b1new=−E1−y1K11(α1new−α1old)−y2K21(α2new−α2old)+bold(37)
同樣,如果0<α2new<C,那麼,
b2new=−E2−y1K12(α1new−α1old)−y2K22(α2new−α2old)+bold(38)
- 如果α1new,α2new同時滿足0<αinew<C, i=1,2,那麼b1new=b2new。
- 如果α1new,α2new是0或者C,那麼b1new,b2new以及他們之間的數都是符合KKT條件的閾值,這時選擇它們的中點作爲bnew
綜上可得:
bnew=2b1new+b2new(39)
差值Ei更新
在每次完成兩個變量的優化之後,還必須更新對應的Ei值,並將他們保存在列表中。Ei值的更新要用到bnew值,以及所有支持向量對應的αj:
Einew=S∑yjαjK(xi,xj)+bnew−yi(40)
- S是所有支持向量xj的集合。非支持向量的E值爲0。
看了很多博客,其實統計學習方法裏面的過程已經很完整,對其中一些過程做了補充,別看在求解時用了很多計算公式,其實裏面沒有很深的知識,就是變換多。
2、變量的選擇方法
SMO算法在每個子問題中選擇兩個變量優化,其中至少一個變量是違反KKT條件的。
(1)第1個變量的選擇
SMO稱選擇第1個變量的過程爲外層循環。外層循環在訓練樣本中選取違反KKT條件最嚴重的樣本點,並將其對應的變量作爲第1個變量。具體的,檢驗訓練樣本點(xi,yi)是否滿足KKT條件,即:
αi=00<αi<Cαi=C⟺yig(xi)≥1⟺yig(xi)=1⟺yig(xi)≤1
- g(xi)=∑j=1NαjyjK(xi,xj)+b
該檢驗是在精度ϵ範圍內進行的,即在精度ϵ範圍內的點不選用。
- 在檢驗過程中,外層循環首先遍歷所有滿足條件0<αi<C的樣本點,即在間隔邊界上的支持向量點,檢驗它們是否滿足KKT條件。
- 如果這些點都滿足KKT條件,那麼就遍歷整個訓練集,檢驗它們是否滿足KKT條件。
(2)第2個變量的選擇
SMO稱選擇第2個變量的過程爲內層循環。假設在外層循環中已經找到第1個變量α1,現在要在內層循環中找到第2個變量α2。第2個變量選擇的標準是希望能使α2有足夠大的變化。
由式(35a)(35)可知,α2new是依賴於∣E1−E2∣的,爲了加快計算速度,一種簡單的做法是選擇α2,使其對應的∣E1−E2∣最大。因爲α1已定,E1也確定了。
- 如果E1是正的,那麼選擇最小的Ei作爲E2;
- 如果E1是負的,那麼選擇最大的Ei作爲E2;
- 爲了節省計算時間,將所有Ei值保存在一個列表中。
在特殊情況下,如果內層循環通過以上方法選擇的α2不能使目標函數有足夠的下降,那麼採用以下啓發式規則繼續選擇α2。
- 遍歷在間隔邊界上的支持向量點,依次將其對應的變量作爲α2試用,直到目標函數有足夠的下降;
- 若找不到合適的α2,那麼遍歷訓練數據集;
- 若仍找不到合適的α2,則放棄第1個α1,再通過外層循環尋找另外的α1。
3、SMO算法
輸入:訓練數據集T={(x1,y1),(x2,y2),⋯,(xN,yN)},其中,xi∈Rn, yi∈{−1,+1}, i=1,2,⋯,N,精度ϵ;
輸出:近似解α^,由於給算法設置了一個精度ϵ,所以最終求得是近似解。
(1)取初值α(0)=0,令k=0;
(2)選取優化變量α1(k),α2(k),解析求解兩個變量的最優化問題(29)(31),求得最優解α1(k+1),α2(k+1),更新α爲α(k+1);
(3)若在精度ϵ範圍內滿足停機條件:
i=1∑Nαiyi=0
0≤αi≤C, i=1,2,⋯,N
yi⋅g(xi)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧≥1,=1,≤1,{xi∣αi=0}{xi∣0<αi<C}{xi∣αi=C}
- g(xi)=∑j=1NαjyjK(xi,xj)+b
則轉(4);否則令k=k+1,轉(2);
(4)取α^=α(k+1)。
對於深入研究支持向量機之前,看了一眼書,這個算法佔的篇幅最大,公式最多,難度應該不一般。研究下來確實不一般,花費六天,每天至少5小時,最終下來感覺還算是比較瞭解了。其實支持向量機的模型和策略都很簡單,模型就是一個超平面,策略就是最大化分類間隔,解決的問題從線性可分到線性近似可分,再到非線性可分;然後就是算法,對最終最優化問題的求解,爲了求解快速、少佔內存,有大牛發明了SMO算法(序列最小最優算法)。
如果是想研究支持向量機可以按我上面的總結看下來絕對沒問題,大致內容和李航的統計學方法一致,我對中間涉及的一些數學知識做了一定補充,這也是我這篇博客與課本差別之一,對一些難以理解的地方詳細展開和知識補充。這篇總結涉及的知識點很多,若有不正確的地方還望指出,以免誤導他人。
之前的學習的幾個算法都是搞懂再來做總結,支持向量機知識點太多,一下全部搞懂挺難的,是知道一點就總結一點,遇到過不去的就停下來找博客,看別人的講解,就這樣把難點逐個擊破,然後整個算法也就總結完了。這也相當於應用了SMO算法的思想,化整爲零,逐個擊破,每一個算法都是智慧的結晶。
參考資料:
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
未完待續