SVM -支持向量機原理詳解與實踐之四

SVM -支持向量機原理詳解與實踐之四

  1. SVM原理分析

    1. SMO算法分析

SMO即Sequential minmal optimization, 是最快的二次規劃的優化算法,特使對線性SVM和稀疏數據性能更優。在正式介紹SMO算法之前,首先要了解座標上升法。

  1. 座標上升法(Coordinate ascent)

座標上升法(Coordinate Ascent)簡單點說就是它每次通過更新函數中的一維,通過多次的迭代以達到優化函數的目的。

  1. 座標上升法原理講解

爲了更加通用的表示算法的求解過程,我們將算法表示成:

 

3.13-1

座標上升法的算法爲:

這個算法中最爲關鍵的地方就是內循環對於的求解,意思是固定除了之外的所有a(從i=1~m),也就是說將除外的其他變量看成是常數,並且將W看做是關於的函數,那麼直接對求導優化得到極大值,在上面算法的版本中,內循環優化變量的順序是但是一個更高級的版本可能選擇其它的順序,例如我可以根據我們的期望來選擇下一個變量來更新,並讓W(a)有最大的增加。

當函數W在內循環中能夠最快的達到最優,則座標上升是一個有效的算法,下面是一個座標上升的示意圖:

上圖中的橢圓形線代表我們需要優化問題的二次函數的等高線,變量數爲2,起始座標是(2,2),途中的直線是迭代優化的路徑,可以看到每一步都會相最優值前進一步,而且前進的路線都是平行與相應的座標軸的,因爲每次只優化一個變量。

 

  1. C++算法編程實踐

問題:求解函數的最大值。

解:回顧我們前面分析的求取函數最大值的關鍵是,求解每一個迭代變量的導數,當求解某一變量的導數的時候,其他的變量看做是常數:

VS2013控制檯工程參考代碼如下:

// Coordinate ascent.cpp : Defines the entry point for the console application.

//

 

#include"stdafx.h"

 

 

#include<iostream>

usingnamespace std;

#definef(x1,x2,x3) (-x1*x1-2*x2*x2-3*x3*x3+2*x1*x2+2*x1*x3-4*x2*x3+6)

int_tmain(intargc,_TCHAR*argv[])

{

    double x1 = 1;

    double x2 = 1;

    double x3 = 1;

    double f0 =f(x1, x2, x3);

    double err = 1.0e-10;

    while (true)

    {

        x1 = x2 + x3;//x1求導的表達式,每次迭代後更新

        x2 = 0.5*x1 - x3;//x2求導的表達式,每次迭代後更新

        x3 = 1.0 / 3 * x1 - 2.0 / 3 * x2;//x3求導的表達式,每次迭代後更新

        double ft =f(x1, x2, x3);//求函數值

        if (abs(ft - f0)<err)//判斷f是否收斂

        {

            break;//收斂即完成求解過程

        }

        f0 = ft;//更新f0

    }

    cout <<"\nmax{f(x1,x2,x3)}=" <<f(x1, x2, x3) << endl;

    cout <<"取得最大值時的座標:\n(x1,x2,x3)=(" << x1 <<"," << x2 <<"," << x3 <<")" << endl;

    system("pause");

    return 0;

}

運行結果如下:

  1. SMO算法詳解

回到我們軟間隔與正則化章節(還有最優間隔分類器),我們的對偶問題,就是通過固定拉格朗日乘子a,得到w和b的最優化表達式(關於a的表達式),所以最後我們只需要確認a,我們就可以最終確定w和b,但是在討論SMO算法之前,我們並沒有真正求解出。這一章我們就會通過介紹SMO算法對對偶問題最後需要解決的問題:

做出一個求解,也就是在參數上求W最大值的問題,注意其中的就是訓練樣本的輸入,x即爲樣本的輸入特徵,y即樣本對應的標籤(結果)。

按照前面介紹的座標上升的思路,我們首先固定除了以外的所有參數,然後在上求極值。現在下面先固定以外的所有參數,看看具體的求解步驟:

  1. 首先由優化問題的約束條件可知:

即可推出

 

 

兩邊乘以:

 
 

(3.13.2-1)

因爲,所以,因此到這一步,就由其它的決定,如果我們固定主,無論如何不能違背優化問題的約束

    因此如果我們想要更新一些的對象,爲了保持滿足約束條件就必須至少快速的更新它們中的兩個,這個就激發出SMO算法,那麼SMO算法可以簡單的描述成:

重複大括號中的操作直到收斂{

  1. 選擇一對來更新下一個(用啓發式的方法,也就是嘗試選取兩個允許我們朝着全局最大方向做最大前進的參數)
  1. 固定所有其它的參數,優化關於和的函數W(a)

}

爲了測試該算法的收斂性,我們可以檢查KKT條件:

是否滿足收斂容錯參數,典型值爲0.1~0.001之間。

SMO作爲一個高效的算法的關鍵原因在於計算更新的效率非常高。假設當前我們有一些滿足(3.10.3-5)的約束,固定,想要優化關於的函數,用表示有:

 

 

由於右邊固定,我們可以直接用一個常數表示,例如用表示:

於是我可以將的約束畫出來:

根據約束條件:

可知上圖中表示的橫軸和縱軸必須限制在0到C的方框內,並且也要在直線上。並且的縱軸也必須滿足,否則就不能滿足約束條件。

下面用表示,過程是:

其中,因爲,所以有:

所以目標問題W可以表示爲:

其中爲常數。

實際的問題中W展開後就是一個關於的二次函數, A、B、C是固定值,這樣通過對W進行求導可得,然而要保證滿足,我們使用 表示求導求出的, 然而最後的,需要根據下面的情況得到:

求出以後,我們可以就可以得到

 

  1. 支持向量機實踐

這裏限於篇幅,實踐的內容將在下一篇展開…


發佈了27 篇原創文章 · 獲贊 98 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章