1. 程式人生 > >我與機器學習 - [Today is SVM] - [支援向量機]

我與機器學習 - [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

http://www.chinahadoop.cn/

下面開始看程式碼:

首先從簡化版的開始入手,就是不含有啟發式的,也就是外層遍歷整個資料集,內層隨機選擇。

虛擬碼:

初始化資料集,標籤集為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