線性支持向量機
上一篇文章對支持向量機的間隔、對偶和KKT條件做了詳細推導,但前文的基礎是原始問題爲線性可分問題,所以對線性不可分訓練數據是不適用的,這時需要引入一個新定義:軟間隔。
假如訓練數據中有一些特異點,也就是分類會出錯的樣本點,將這些特異點除去後,剩下的大部分樣本點組成的集合是線性可分的,訓練數據線性可分時所對應的間隔也被稱爲硬間隔。
線性不可分也就意味着某些樣本點不能滿足函數間隔大於等於1的約束條件,即位於兩條虛線之間;可以對每個樣本點引入一個鬆弛變量,使函數間隔加上這個鬆弛變量後大於等於1;並且對於每個鬆弛變量都會支付一個代價,所以目標函數和約束條件會變成如下形式:
其中C稱爲懲罰參數,新的目標函數是想函數間隔儘量大,同時錯分的樣本點個數儘量小,而C就是調和二者的係數,對於線性不可分的優化問題就變成了凸二次優化問題(原始問題)。
訓練數據樣本線性不可分時的模型也就成爲線性支持向量機,線性支持向量機是包含線性可分支持向量機的,由於現實中的數據集往往是線性不可分的,所以線性支持向量機具有更廣的適用性。
將這個原始問題利用拉格朗日乘子法的對偶性轉化成對偶問題的形式如下:
這裏的推導過程與前文的原理類似,所以只簡要概述一下。首先依據目標函數與約束條件利用拉格朗日乘子法構造出拉格朗日函數,然後依次對三個變量求導,而對偶問題就是拉格朗日函數的極大的極小值問題,隨後即可得出上述對偶問題的形式。
SMO算法
原理概要
SMO算法是一種啓發式算法,基本思路爲:如果所有變量的解滿足此最優化問題的KKT條件,那麼就得到了最優解,因爲KKT條件是該最優化問題的充分必要條件。
否則,需要選擇兩個變量,並且固定其他變量,只針對這兩個變量構建一個最優化問題,這裏的兩個變量一個是違反KKT條件最嚴重的那一個,另一個則是由約束條件確定。這樣原問題就可以不斷劃分成若干個子問題,從而提高了整個算法的效率。
爲什麼選擇兩個變量而不是一個呢?因爲當時拉格朗日函數對b求導時得到了一個等式約束條件,如下:
假如我們只選擇一個變量,固定剩下變量,那麼這個變量的值也已經固定了。
最優解上下界
對於最優化問題原問題而言,可以利用其約束條件計算出的上下界。如果固定的變量爲,在等式條件的約束下可以化成下面形式,其中k爲自己設定的一個常量:
由於的取值範圍總是在0至C之間,並且對應共有4種組合方式,這裏歸結爲兩種分別爲,所以可以通過兩個式子繪圖如下:
假設上述約束條件的初始可行解爲,對應最優解爲。因爲現在兩個變量所取最優值位於平行於對角線的兩個線段上,一個達到最優時,另一個也會隨之達到最優,所以可以將其轉化成單變量的最優化問題。
由於總是滿足不等式約束,所以這個解的取值一定會位於一個範圍之中,這裏將其下界設爲L、上界設爲H,這個L和H就是所在線段端點的界。
當時,的上下界如下:
當時,的上下界如下:
目標函數轉化
在處理過約束條件後,下面需要對原始問題的目標函數做一些處理,因爲SMO算法的思路首先就是選擇兩個變量固定剩餘變量嘛,所以將目標函數“打開”,相應處理如下:
經合併處理後得:
其中K(i,j)是正定核的知識,下篇文章會提及,這裏只需要知道K(i,j)=K(j,i)即可,上述公式中元素合併時會利用這個性質。
因爲在約束條件中已經確定了只優化,所以目標函數對求導時只想留下下標爲2的,其餘的變量就需要利用常數或者替換。
這裏需要引入一個新的概念:誤差。
當i=1,2時,誤差爲分類決策函數的預測值與真實值之差。
目標函數式子中的可以利用進行替換,如下式:
除此之外目標函數中還有下標在3以上的累加集合,這部分相當於一個常數並且也存在於中,所以可推出下列等式:
對目標函數的元素替換並結果對求導後得出下式:
進一步移項處理後:
最後將誤差和關於k的等式約束條件帶入上式可得:
其中稱作學習速率,但是這裏的還未被上述求得的上下界約束條件修剪,所以這裏暫時利用一個新的值代替。
經過上述約束的修剪,最優解就可以記爲了,具體如下:
將得出的代入等式即可得出的值爲:
變量選擇
上文提及了SMO算法在每個子問題中都會選擇兩個變量,“一個變量是違反KKT條件最嚴重的”,這句話的意思也就是最不滿足KKT條件的,下面介紹選擇變量的具體操作。
SMO將第一個變量的選擇稱爲外層循環,首先遍歷整個樣本集,選擇違反KKT條件最嚴重的的樣本點,將其對應變量作爲第一個變量。具體操作就是檢驗樣本點是否滿足KKT條件,如下:
前兩個條件可以利用前文提及的硬間隔所對應的KKT條件理解,先回顧一下:
由這兩個條件可以確定當時,樣本點一定是位於兩側虛線之外;當時,即樣本點是支持向量,位於虛線之上;而對於,表示樣本點位於鬆弛變量與分離超平面之間。
在檢驗過程中,外層循環首先遍歷所有支持向量點(滿足第二個條件),檢驗他們是否滿足KKT條件。如果這樣樣本點都滿足KKT條件,那麼將遍歷整個數據集的樣本點,檢驗他們是否滿足KKT條件。直到整個數據集中沒有違反KKT條件的點,然後退出。
SMO將第二個變量的選擇稱爲內循環,假設在外層循環中已經找到了第一個變量,現在就要在內層循環中找到第二個變量,而選擇的標準是希望能使有足夠大的變化,這樣的目的是讓目標函數迭代優化的函數值收斂速度更快。
通過上面公式推導,我們已知的是是依賴於的,那麼只要使對應的最大即可。由於已確定,所以也隨之確定。如果是正值,那麼選擇最小的作爲;如果是負值,那麼選擇最大的作爲;通常將所有的存入至一個列表中,在列表中選擇最大的。
內層循環選擇的順序與外層循環一致,先遍歷支持向量點,若沒有合適的,則將遍歷整個數據集;若仍找不到合適的,則放棄,再通過外層循環尋找另外的。
計算閾值b
每完成對兩個變量的優化後,要對b的值進行更新,因爲b的值關係到的計算,即關係到下次優化時的計算。
當時,根據已知的條件可以做以下推導:
並且我們已知的公式,將其“打開”得:
可以利用關於的等式替換中的前兩項,最後得出,具體推導如下:
同理可推導出的公式如下:
若同時滿足條件,此時。
而如果是0或者C時,則及其中間的數都符合KKT條件,所以選擇兩者的中間值作爲此時的。
在每次完成對兩個變量的優化之後,必須要更新對應的值,而更新時要用到上述提及,以及所有支持向量對應的,更新過程如下:
其中,s爲所有支持向量的集合。
總結
最後梳理一下文章內涉及的知識點和流程,首先由線性不可分問題引出了軟間隔的定義,並構建了新的目標函數和約束條件,並且利用拉格朗日乘子法將原問題轉化成對應的對偶問題。
然後在已知最優化問題後開始介紹了SMO算法,將約束條件轉化爲需要優化的變量的上下界。在處理目標函數時,我們只想留下這一個變量,所以需要替換元素,這裏引入了誤差解決了這個問題,並且在得到最優解後利用上下界進行修剪。
接着介紹了最優化問題中兩個變量是如何選擇的,最後介紹了閾值b的推導方法,並且在閾值b的基礎上得出每次更新的公式。
關注公衆號【奶糖貓】獲取每篇文章的源碼和數據,歡迎各位夥伴和博主交流呀。