支持向量機(SVM)——SMO演算法
接著上一篇的原理推導,SVM最後要求解以下二次規劃問題(線性支持向量機)
關於這種二次規劃問題求解的方法有很多,SMO演算法就是其中一種。SMO演算法是一種啟發式演算法,基本思路是:如果所有變數的解都滿足此最優化問題的KKT條件,那麼這麼最優化問題的解就得到了。
令
根據KKT條件可以得出二次規劃問題中 取值的意義為
第一種情況表示對應實例點在邊界內,即被正確分類的點;第二種情況表示在兩條邊界線之間;第三種情況表示對應實例點在邊界上,為支持向量。
而最優解需要滿足KKT條件,即上述3個條件都得滿足,也就是說,如果存在不能滿足KKT條件的 , 那麼需要更新這些 ,這是第一個約束條件。這些違背KKT條件的 可以根據以下條件判斷:
此外,更新的同時還要受到第二個約束條件的限制,即:
因為這個條件,我們同時更新兩個 值,因為只有成對更新,才能保證更新之後的值仍然滿足和為0的約束,假設我們選擇的兩個乘子為 和 ,其他變數 是固定的,於是SMO的最優化問題可以寫成
其中, , 是常數,目標函數中省略了不含 和 的常數項(因為求導以後會等於0)。
為了求解兩個變數的二次規劃問題,先分析約束條件,再在此約束條件下求極小值。
如圖,約束條件使最優解 位於與對角線平行的直線上,這使得兩個變數的最優化問題成為實質上單變數的最優化問題,不妨考慮為變數 的最優化問題。假設初始可行解為 ,最優解為 。而 需滿足
由上圖可知
設 為誤差項, 為學習率
可得(具體證明可見《統計學習方法》定理7.6的證明)為經剪輯的解為
考慮約束以後,得到最終經剪輯過得解為
進一步,可以得到
至此,我們得到了SMO演算法中一個子問題的最優解 ,而SMO演算法就是由若干個這種子問題組成的。但是,我們該如何選擇每個子問題中的兩個變數呢?這裡有兩種方法,分別對應了簡化版的SMO演算法和完整版的SMO演算法:
簡化版SMO演算法:
檢查訓練樣本中每個點 是否滿足KKT條件,如果不滿足,則它對應的 可以被優化,然後隨機選擇另一個變數 進行優化。
完整版SMO演算法:
簡化版的SMO演算法在小數據集上沒什麼問題,但遇到大數據集速度就會變得很慢。完整版的演算法與簡化版的演算法唯一不同的就是 的選擇。具體地,先通過一個外循環來選擇第一個 ,並且其選擇過程會再兩種方式之間進行交替:一種方式是在所有數據集上進行單遍掃描,另一種方式則是在非邊界 中實現單遍掃描。所謂非邊界 即那些 或 的 。對整個數據集掃描很容易,而實現非邊界掃描,首先要建立這些 的列表,然後再對這個表進行遍歷。同時,該步驟會跳過那些已知的不會改變的 值。
在選擇第一個 後,演算法會通過一個內循環來選擇第二個 。優化過程中會通過最大化步長的方式來獲取第二個 。
每次優化完兩個變數以後,都需要重新計算閾值 ,當 時,由KKT條件可知
於是,
又
所以
同理
當 和 同時滿足條件 ,那麼 。如果 和 是0或 ,那麼 和它們之間的數都是滿足KKT條件的閾值,這是選擇它們的中點,即
綜上所有討論,可以總結SMO演算法如下:
(1) 計算誤差:
(2) 計算上下邊界L,H
(3) 計算
(4) 更新
(5) 根據取值範圍修剪
(6) 更新
(7) 更新
參考
[1]《統計學習方法》 李航
[2]《機器學習》周志華
[3]《機器學習實戰》Peter Harrington
[3]Python3《機器學習實戰》學習筆記(八):支持向量機原理篇之手撕線性SVM Jack-Cui
[4]支持向量機(Support Vector Machine)-----SVM之SMO演算法(轉)
[5]C_SVC推導(經典的SVM模型)
推薦閱讀:
※人工智慧——狀態機
※未來政治制度是一個「演算法」制度
※常見的深度學習模型--卷積神經網路概述
※Character人物之線條表現