我與機器學習 - [Today is SVM] - [支援向量機]
支援向量機分為:
線性可分支援向量機,線性支援向量機,非線性支援向量機。
下面開始推導:
核心思想:讓距離最小的點取最大。就是對於每一個可行的超平面,計算最近的點的距離,找到一個超平面,能使這個距離最大,就是最好的分割超平面,這樣分類的效果最明顯。
計算點到直線的距離
然後,轉化為求 max min d的問題
然後,我們希望預測值和實際值是相同的,也就是說,預測值和實際值同號,這裡yi為實際值,y(xi)為預測值,就有yi * y(xi) > 0,於是得到下圖的函式。
該函式就是svm的目標函式,滿足預測值與實際值同號,選擇一條距離最小距離點最大的分割線或者分割平面。
至此,目標函式已經求出來了,接下來的問題就是求解目標函式。
這裡對W進行了縮放操作,為了就是能讓y>=1,說明如下圖。
當有了這個條件,就可以接著化簡。
不等式約束問題,考慮到用拉格朗日乘子法,得到:
這樣一個式子,該怎麼取處理。
接下來就是分別對w和b求偏導,然後帶入到式子中得到一個關於a的式子。
這裡得到了兩個式子。
將其帶回到拉格朗日的式子中:
這裡還是將求max問題轉化為求min問題
這裡新增了一個約束,ai >= 0 這是因為在對
這個式子作處理的時候,我們希望,max L(w,b,a) 能取到一個a,使得該式子最大,也就是等於||w||平方/2.
所以式子推導到這裡,有兩個約束條件。
這裡求得a後,就可以求得w,b
至此,svm目標函式以及推導就全部完成了,現在擺在面前的問題是,對於目標函式,怎麼求得a,對於這個問題,著名的解決svm問題的smo演算法的確是第一選擇。接下來我們將會推導smo演算法。
在推導smo之前,先進行一個例子,對剛才的問題做一個鞏固。
這個例子得到什麼啟示:
這裡求得的x1對應的a1為1/4,x2對應的a2為0,x3對應的a3為1/4,所以,將a2帶入到求w的式子中,可以看出來,x2這個樣本點對求w沒有起到作用。而x1和x3這兩個樣本,對w是有作用的,我們把這兩個點叫做支撐點。
推導到N維,我們說對於n個樣本,有對應的n個a,可能只有個別a是不等於0的,我們把這些不等於0的樣本點,就叫做支撐向量。對於所有的a來說,a是一個稀疏的。
以上說明的是,線性可分支援向量機,是一種理想情況,當樣本集無法只用一條直線完美區分開的時候,這時候就有了,線性支援向量機。
其區別就是增加了一個鬆弛因子。
這裡的C是個重點,表示對鬆弛因子的容忍度,svm的api調引數的重點,也是api中c代表的含義。
這裡的C直觀上看,表示,支撐向量距離分割超平面的距離,由式子上來看C。
當C無窮大的時候,後面的柯西的求和不管多小,整個式子都無法滿足求最小。所以這裡C的意義就是控制鬆弛因子的一個權重。
C越大表示,不允許犯錯,所以支撐向量到分割超平面的距離越小。這時訓練集分類很精密,容易造成過擬合。
C越小表示,支撐向量面到分割超平面的距離大,泛化能力好。
當C = 無窮,就等價於線性可分svm。
下面來看核函式
這裡多使用的是高斯核函式也就是徑向基函式。
看一下徑向基函式,這裡類比於高斯分佈的概率密度函式,假設其等價於均值為x1,方差為sigma平方的高斯分佈,當sigma很大的時候,說明方差很大,高斯函式的底部很開,當非常開散的時候,就好像一條直線,當方差很小時,高斯函式的頂部很尖。
而對於svm函式很重要的另一個引數就是gama,gama = -1/sigma的平方,在svm調參中,很多api中的gama就是這個意思。
由圖中可知,gama越大,對樣本點的精度越高,越容易形成過擬合。
gama越小,泛化能力越好,分介面越接近一條直線。逼近線性的svm。
當使用高斯核函式時候,其分類過程相當於將一部分資料提升上去,一部分資料降下來。
下面開始smo部分的講解
SMO-Sequential Minimal Optimization,序列最小優化,SMO的基本思路就是:先固定ai之外的所有引數,然後求ai的極值。但是問題中存在約束條件:
如果固定了ai之外的其他變數,則ai可以由其他的變數匯出。於是,一次只留一個引數,固定其餘引數的方法在這裡是不適用的,但是這個思想卻給了我們不錯的啟發。那麼,SMO可以每次選擇兩個變數ai和aj,並固定其他引數。這樣,在引數初始化之後,SMO不斷迭代重複下面的步驟,直至收斂:
1.選取一對新的ai,aj。
2.固定其他的引數,求解優化的ai,aj,獲取更新後的ai,aj。
簡化原目標函式:
原目標函式為:
改為只有a1和a2為變數,其餘都為常量。
有了這個式子之後,接下來確定解的範圍。
接下來進入求解過程
對該式子關於a2求導:
式子中含有v1,v2,需要作變換
將求出來的v1和v2帶入到求導的等式中
現在a1和a2地推公式已經求解完成。
下面來看一下w和b怎麼求解出來
w的求解:
再來看b:
以上smo演算法的推導就完成了,接下來我麼要看一下smo啟發式的方法
在SMO演算法中,如果使用遍歷所有的αi,再隨機選擇第二個變數進行優化,也能實現功能,但是演算法速度非常的慢,為了提高演算法的運算速度,目前一般採用一種啟發式的變數選擇。
第二個變數的選擇上:
假設在外迴圈中找到的第一個變數記為α1,那麼第二個變數的選擇我希望能使α2有較大的變化。由於α2是依賴於|E1−E2|,當Ei為正時,那麼選擇最小的Ei作為E2 ,如果Ei為負,選擇最大Ei作為E2,通常為每個樣本的Ei儲存在一個列表中,選擇最大的|E1−E2|來近似最大化步長。
至此,svm演算法和smo演算法推演完畢。
以上部分部分內容轉自:
https://blog.csdn.net/kabuto_hui/article/details/80369793
下面開始看程式碼:
首先從簡化版的開始入手,就是不含有啟發式的,也就是外層遍歷整個資料集,內層隨機選擇。
虛擬碼:
初始化資料集,標籤集為numpy的矩陣
初始化b = 0
計算資料集的維度 m行 n列
初始化alpha,維度為m行1列的
初始化迭代次數 = o
while迴圈判斷迭代次數如果小於設定的最大迭代次數
初始化一個bool變數標記是否有alpha變化 alphapairchanged
對所有資料進行for迴圈遍歷
計算f(xi) 公式:
計算預測誤差Ei
判斷該xi是否符合標準(需要選擇一個違反KKT條件的變數)
接下來隨機選擇一個aj
計算f(xj)
計算預測誤差Ej
獲取alpha_i_old,alpha_j_out
判斷alpha的範圍,分兩種情況
yi等於yj的時候
下界low等於 max{0,α1+α2−C}
上界high等於 min{α1+α2,C}
yi不等於yj的時候
下界low等於 max{0,α2−α1}
上界high等於 min{C,C+α2−α1}
如果low等於high跳過執行下一次迴圈
計算eta 公式為 η=2K12 - K11+K22
如果eta大於0 跳過執行下一次迴圈
迭代alphaj 公式為
得到的新alphaj檢查上下界
計算新的alphaj和舊的alphaj的差值如果小於一個閾值,跳過執行下一次迴圈
迭代alphai 公式為
然後迭代b,計算b1和b2 公式為
如果0<ai<c b等於b1,如果0<aj<c b等於b2,如果都不滿足 b = b1+b2/2
所有引數都更新了之後,更新bool變數 alphapairchanged
如果 alphapairchanged 等於0
迭代次數加1
否則
迭代次數清0
返回alpha 和 b