libsvm最新源代碼(版本3.21)理解解析(二)

一、回顧

上節,我們介紹到了SMO的總體過程,本節對SMO的三個難點結合代碼進行詳細分析。

二、SMO算法

(1)設置拉格朗日乘子α=(α[1]...α[i]...α[l])的初始值(一般設爲全0),並設置迭代次數計數器k=1。

(2)如果α向量已經收斂(符合KKT達到停止條件),停止循環,返回結果;否則,找出工作集B=(i,j),實際上就是找出所要更新的兩個α(α[i],α[j])的下標,另外定義剩下的α的下標標號爲N,即N=(1,2...l)\B(\表示去掉B中元素),並定義B所對應的α爲,N所對對應的α爲

(3)若,解決如下問題:


否則,解決下面問題:


實際上都是關於α的更新方式,至於如何解決這兩個問題以及α的詳細計算公式會在後面介紹。

4)用新的α[i],α[j]替換原來的α[i],α[j],迭代計數器k=k+1,跳到第二步,繼續循環。

三、KKT條件

在上一篇博客說過,上述SMO算法存在三個難點:

(1)如何判斷α收斂,即如何停止循環,達到KKT條件。

(2)如何找出工作集B=(i,j),即如何選出兩個要更新的α=(α[i],α[j]);

(3)如何更新工作集中的α,即如何更新α[i],α[j]。

下面我們來看如何解決第一個問題。

那麼什麼是KKT條件呢?

假設我們要解決的是含有等式和不等式約束的最優化問題:

   

其中,p爲等式約束條件的數量,q爲不等式約束條件的數量。

f(x)在達到最優值(最小值)時必須滿足KKT條件,即:


這就是所謂的KKT條件,也就是等式的拉格朗日乘子λ不能爲0,不等式(必須是小於號)的拉格朗日乘子μ必須大於0且與不等式g(x)的乘積等於0,同時拉格朗日函數對未知數α的導數等於0(上述2式)

下面,我們看支持向量機的優化問題:

         

上述優化問題經過整理可得:

        

包含兩個不等式集合(分別爲l個)和一個等式約束集合(l個)。

該優化問題的拉格朗日函數如下:

       

其中,b,λ,ξ均爲拉格朗日乘子,從而可得KKT條件爲:


即:

       

        其中,

<C時,C-α>0,ξ(C-α)=0,那麼ξ=0,又因爲λ>=0,所以由14式得:>=0

同理,可得當>0,因爲λα=0,所以λ=0,因爲ξ>=0,所以由14式得: <=0。

綜上所知,得:

       

因爲,y取+1或者-1,將15式左右乘以yi,又可以分兩種情況,比如>C時,如果=+1,那麼=+b>=0;當=-1時,兩面乘以,得-=--b>=0,即+b<=0,同理可分析當>0和=+1和-1的情況,最後可得一個關於b的不等式:


實際上,上式就是15式對=+1和-1兩種情況的討論結果。這意味着,滿足KKT條件就得滿足上式,也就是:


當然,在現實中,我們不這麼嚴密,常採取以下的條件,即:


ε被稱爲容忍因子。

所以,當我們檢測17式就可以當作SMO循環結束的條件,LIBSVM中也是這麼做的。

四、工作集的選擇

在第三節中,我們討論了SMO的一個難點就是SMO循環結束的停止條件,接下來我們討論如何選取工作集B=(i,j),也就是如何選取所要更新的至於原理性的內容,論文Working Set Selection Using Second Order Information for Training Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/quadworkset.pdf)進行了詳細介紹,挺難理解的,本人目前也未理解,後續可能對原理性繼續進行闡述。本文主要對選擇過程進行描述。

工作集B=(i,j)的選擇過程如下:

(1)計算

(2)若>0,則=,否則=是自行設置的一個很小的正數。即:


(3)接下來選擇i和j,通過選擇最大離散對。首先選擇i,

   

通過計算,找出集合中使得最大的那個t(t屬於),將其值賦給i。

找出i後,根據i值尋找j:

               

上式的意思是在一個集合中計算值,找出使該值最小的t,賦給j,這個t屬於的集合滿足兩個條件:首先t屬於集合,同時,還得滿足,這裏的i爲第一步中選出的i。

過程稍微比較繞,但是理解了後就是兩步,第一步找出i,然後根據i找出j。

(4)將i和j返回。

五、的更新

在第四節中我們找出了α的標號i和j,也就是工作集i和j,那麼接下來就是更新

在開頭我們介紹的SMO算法流程中,介紹了α的更新要根據是否大於0來解決兩個問題,這兩個問題的詳細解決過程在論文LIBSVM: A Library for Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf)進行了介紹,本文只講述結果。

經過論文中的轉換和計算,最終的計算公式如下:

   

其中,爲舊值,爲所對應的樣本標籤值,時,

因爲可能同號也可能異號,所以42式又可以分爲兩種情況,這裏我們拿異號討論一下,同號可類似。

異號時:

帶入42式得:

   

同時,因爲還有0<=α<=C的限制。假設,我們將對應的懲罰因子記爲對應的懲罰因子記爲(上篇博文中我們說過,爲了應對不平衡數據,不同符合的α可能採取不同的懲罰因子C),那麼綜合考慮,α的更新如下:


這個圖將α的更新的各種限制分爲4個區域。因爲(因爲SMO更新兩個α,其它不變,所有的α滿足y1α1+y2α2+...ylαl=常數,即yiαi+yjαj=常數,帶入y就可得,減號是因爲yi和yj異號),我們拿region I當作例子分析一下:

超過了界限,所以取最大值,由於,所以綜上所知,可得:

同樣,當處於region II等其它區域時,可類似分析。

這樣,α得更新就介紹完畢了,完整僞代碼如下:  

if (y[i] != y[j])
{
	double quad_coef = Q_i[i] + Q_j[j] + 2 * Q_i[j];
	if (quad_coef <= 0)quad_coef = TAU;
	double delta = (-G[i] - G[j]) / quad_coef;
	double diff = alpha[i] - alpha[j];
	alpha[i] += delta;
	alpha[j] += delta;
	if (diff > 0)
	{
		if (alpha[j] < 0) // in region III
		{
			alpha[j] = 0;
			alpha[i] = diff;
		}
	}
	else
	{
		if (alpha[i] < 0) // in region IV
		{
			alpha[i] = 0;
			alpha[j] = -diff;
		}
	}
	if (diff > C_i - C_j)
	{
		if (alpha[i] > C_i) // in region I
		{
			alpha[i] = C_i;
			alpha[j] = C_i - diff;
		}
	}
	else
	{
		if (alpha[j] > C_j) // in region II
		{
			alpha[j] = C_j;
			alpha[i] = C_j + diff;
		}
	}
}
If yi = yj, the derivation is the same.

六、總結

本文詳細介紹了LIBSVM中SMO算法最重要得三個難點,結合代碼的分析將在以後進行介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章