注:關於支持向量機系列文章是借鑒大神的神作,加以自己的理解寫成的;若對原作者有損請告知,我會及時處理。轉載請標明來源。
序:
我在支持向量機系列中主要講支持向量機的公式推導,第一部分講到推出拉格朗日對偶函數的對偶因子α;第二部分是SMO算法對於對偶因子的求解;第三部分是核函數的原理與應用,講核函數的推理及常用的核函數有哪些;第四部分是支持向量機的應用,按照機器學習實戰的代碼詳細解讀。
機器學習之支持向量機(四):支持向量機的Python語言實現
1 SMO算法的概念
這里補充一點,后面的K () 函數是核函數,是把低維度的數據投射到高維度中,即把非線性轉換成線性分類。知道k 是核函數就可以了,后面會再詳細講解k 函數。我們在上篇中得到關於對偶因子的式子,對其求 α 極大,現在添加符號轉化成求極小,兩者等價。
轉化后的目標函數:
其中 約束條件中 C 是懲罰系數,由對非線性加上松弛因子得到的。
1998年,由Platt提出的序列最小最優化算法(SMO)可以高效的求解上述SVM問題,它把原始求解N個參數二次規划問題分解成很多個子二次規划問題分別求解,每個子問題只需要求解2個參數,方法類似於坐標上升,節省時間成本和降低了內存需求。每次啟發式選擇兩個變量進行優化,不斷循環,直到達到函數最優值。
2 SMO算法原理分析
我們的目標:求解對偶因子 α (α1, α2, ... , αN)
2.1 目標函數化成二元函數
SMO算法是通過一定的規定選擇兩個參數進行優化,並固定其余 N - 2 個參數,假如選取優化的參數是 α1, α2 ,固定α3, α4 , .., αN ,對目標函數進行化簡成二元函數得:
這里強調一下,式子中的 Kij 是核函數,知道意思就可以,不了解不太影響SMO算法的推導。
2.2 將二元函數化成一元函數
約束條件:
得到
,其中 ζ 是一個定值。
讓兩邊同時乘以y1 ,化簡得到:
將(2)式帶入到(1)中可得:
2.3 對一元函數求極值點
對(3)式求導並等於0,得:
假設求解得到的值,記為α1new 、α2new 優化前的解記為α1old 、α2old ,由約束條件知:
得到:
再設支持向量機超平面模型為:f (x) = ωTx + b , ω = Σ αi yi xi 即 f (xi) 為樣本xi 的預測值,yi 表示 xi 的真實值,則令Ei 表示誤差值。
由於 可得:
將上面的式子(4)(6)(7)帶入求導公式中,此時解出的 α2new 沒有考慮到約束條件,先記為 α2new unclipped ,得:
帶入(5)式子,得:
2.4 求得最終的對偶因子
以上求得的 α2new unclipped 沒考慮約束條件:
當和
異號時,也就是一個為1,一個為-1時,他們可以表示成一條直線,斜率為1。
橫軸是,縱軸是
,
和
既要在矩形方框內,也要在直線上,因此 L <= α2new <= H
最終得到的值:
再根據 得到 α1new :
2.5 臨界情況的求值
對於大部分情況 η = K11 + K22 - 2K12 > 0 ,求解方式如上;但 η <= 0 , α2new 取臨界點L或H。
當η<0時,目標函數為凸函數,沒有極小值,極值在定義域邊界處取得。
當η=0時,目標函數為單調函數,同樣在邊界處取極值。
計算方法:
3 啟發式選取變量
3.1 對第一個變量的選取
第一個變量的選擇稱為外循環,首先遍歷整個樣本集,選擇違反KKT條件的αi作為第一個變量,接着依據相關規則選擇第二個變量(見下面分析),對這兩個變量采用上述方法進行優化。當遍歷完整個樣本集后,遍歷非邊界樣本集(0<αi<C)中違反KKT的αi作為第一個變量,同樣依據相關規則選擇第二個變量,對此兩個變量進行優化。當遍歷完非邊界樣本集后,再次回到遍歷整個樣本集中尋找,即在整個樣本集與非邊界樣本集上來回切換,尋找違反KKT條件的αi作為第一個變量。直到遍歷整個樣本集后,沒有違反KKT條件αi,然后退出。
3.2 對第二個變量的選取
SMO稱第二個變量的選擇過程為內循環,假設在外循環中找個第一個變量記為α1,第二個變量的選擇希望能使α2有較大的變化,由於α2是依賴於|E1−E2|,當E1為正時,那么選擇最小的Ei作為E2,如果E1為負,選擇最大Ei作為E2,通常為每個樣本的Ei保存在一個列表中,選擇最大的|E1−E2|來近似最大化步長。
4 閾值b的計算
每完成兩個變量的優化后,都要對閾值 b 進行更新,因為關系到 f(x) 的計算,即關系到下次優化時計算。
這部分結束了,通過SMO算法解出的對偶因子的值,可以得到最優的超平面方程 f (x) = ωTx + b ,即對樣本能夠划分。以上大多借鑒了勿在浮沙築高台的blog 文章,他寫的已經很清晰,我只是在他的基礎上
增加或刪去不好理解的內容。下篇是對核函數和KKT條件的解釋。
機器學習之支持向量機(四):支持向量機的Python語言實現
參考: