一、回顧 上節,我們介紹到了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所對應的α為
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,N所對對應的α為
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 。
(3)若
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,解決如下問題:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 否則,解決下面問題:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 實際上都是關于α的更新方式,至于如何解決這兩個問題以及α的詳細計算公式會在後面介紹。
4)用新的α[i],α[j]替換原來的α[i],α[j],疊代計數器k=k+1,跳到第二步,繼續循環。
三、KKT條件 在上一篇部落格說過,上述SMO算法存在三個難點:
(1)如何判斷α收斂,即如何停止循環,達到KKT條件。
(2)如何找出工作集B=(i,j),即如何選出兩個要更新的α=(α[i],α[j]);
(3)如何更新工作集中的α,即如何更新α[i],α[j]。
下面我們來看如何解決第一個問題。
那麼什麼是KKT條件呢?
假設我們要解決的是含有等式和不等式限制的最優化問題:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 其中,p為等式限制條件的數量,q為不等式限制條件的數量。
f(x)在達到最優值(最小值)時必須滿足KKT條件,即:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 這就是所謂的KKT條件,也就是等式的拉格朗日乘子λ不能為0,不等式(必須是小于号)的拉格朗日乘子μ必須大于0且與不等式g(x)的乘積等于0,同時拉格朗日函數對未知數α的導數等于0(上述2式)。
下面,我們看支援向量機的優化問題:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 上述優化問題經過整理可得:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 包含兩個不等式集合(分别為l個)和一個等式限制集合(l個)。
該優化問題的拉格朗日函數如下:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 其中,b,λ,ξ均為拉格朗日乘子,進而可得KKT條件為:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 即:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 其中,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 。
當
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 <C時,C-α>0,ξ(C-α)=0,那麼ξ=0,又因為λ>=0,是以由14式得:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 >=0
同理,可得當
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 >0,因為λα=0,是以λ=0,因為ξ>=0,是以由14式得:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 <=0。
綜上所知,得:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 因為,y取+1或者-1,将15式左右乘以yi,又可以分兩種情況,比如
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 >C時,如果
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 =+1,那麼
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 =
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 +b>=0;當
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 =-1時,兩面乘以
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,得-
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 =-
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 -b>=0,即
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 +b<=0,同理可分析當
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 >0和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 =+1和-1的情況,最後可得一個關于b的不等式:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 實際上,上式就是15式對
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 =+1和-1兩種情況的讨論結果。這意味着,滿足KKT條件就得滿足上式,也就是:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 當然,在現實中,我們不這麼嚴密,常采取以下的條件,即:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ε被稱為容忍因子。
是以,當我們檢測17式就可以當作SMO循環結束的條件,LIBSVM中也是這麼做的。
四、工作集的選擇 在第三節中,我們讨論了SMO的一個難點就是SMO循環結束的停止條件,接下來我們讨論如何選取工作集B=(i,j),也就是如何選取所要更新的
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 。至于原理性的内容,論文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)計算
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 (2)若
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 >0,則
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 =
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,否則
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 =
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 是自行設定的一個很小的正數。即:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 (3)接下來選擇i和j,通過選擇最大離散對。首先選擇i,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 通過計算
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,找出集合
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 中使得
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 最大的那個t(t屬于
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ),将其值賦給i。
找出i後,根據i值尋找j:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 上式的意思是在一個集合中計算
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 值,找出使該值最小的t,賦給j,這個t屬于的集合滿足兩個條件:首先t屬于集合
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,同時,還得滿足
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,這裡的i為第一步中選出的i。
過程稍微比較繞,但是了解了後就是兩步,第一步找出i,然後根據i找出j。
(4)将i和j傳回。
五、 libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和 libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 的更新 在第四節中我們找出了α的标号i和j,也就是工作集i和j,那麼接下來就是更新
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 。
在開頭我們介紹的SMO算法流程中,介紹了α的更新要根據
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 是否大于0來解決兩個問題,這兩個問題的詳細解決過程在論文LIBSVM: A Library for Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf)進行了介紹,本文隻講述結果。
經過論文中的轉換和計算,最終
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 的計算公式如下:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 其中,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 為舊值,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 為所對應的樣本标簽值,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 時,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 時
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 。
因為
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 可能同号也可能異号,是以42式又可以分為兩種情況,這裡我們拿異号讨論一下,同号可類似。
當
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 異号時:
将
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 帶入42式得:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 同時,因為
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 和
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 還有0<=α<=C的限制。假設,我們将
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 對應的懲罰因子記為
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 對應的懲罰因子記為
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 (上篇博文中我們說過,為了應對不平衡資料,不同符合的α可能采取不同的懲罰因子C),那麼綜合考慮,α的更新如下:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 這個圖将α的更新的各種限制分為4個區域。因為
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 (因為SMO更新兩個α,其它不變,所有的α滿足y1α1+y2α2+...ylαl=常數,即yiαi+yjαj=常數,帶入y就可得,減号是因為yi和yj異号),我們拿region I當作例子分析一下:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 超過了界限
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,是以
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 取最大值
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,由于
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 ,是以綜上所知,可得:
libsvm最新源代碼(版本3.21)了解解析(二)一、回顧二、SMO算法三、KKT條件四、工作集的選擇五、和的更新六、總結 同樣,當處于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算法最重要得三個難點,結合代碼的分析将在以後進行介紹。