機器學習算法系列--支持向量機(SVM)

原文:http://blog.csdn.net/alvine008/article/details/9097105

手把手教你實現SVM算法(一)

 

什麼是機器學習 (Machine Learning

      機器學習是研究計算機怎樣模擬或實現人類的學習行爲,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的性能。它是人工智能的核心,是使計算機具有智能的根本途徑,其應用遍及人工智能的各個領域。

機器學習的大致分類:

1)分類(模式識別):要求系統依據已知的分類知識對輸入的未知模式(該模式的描述)作分析,以確定輸入模式的類屬,例如手寫識別(識別是不是這個數)。

2)問題求解:要求對於給定的目標狀態,尋找一個將當前狀態轉換爲目標狀態的動作序列。

SVM一般是用來分類的(一般先分爲兩類,再向多類推廣一生二,二生三,三生萬物哈)

                                    clip_image002

問題的描述

向量表示:假設一個樣本有n個變量(特徵):Ⅹ= (X1,X2,…,Xn)T

樣本表示方法:

clip_image004

SVM線性分類器

SVM從線性可分情況下的最優分類面發展而來。最優分類面就是要求分類線不但能將兩類正確分開(訓練錯誤率爲0),且使分類間隔最大。SVM考慮尋找一個滿足分類要求的超平面,並且使訓練集中的點距離分類面儘可能的遠,也就是尋找一個分類面使它兩側的空白區域(margin)最大。

過兩類樣本中離分類面最近的點且平行於最優分類面的超平面上H1,H2的訓練樣本就叫做支持向量。

圖例:

clip_image006

問題描述:

假定訓練數據 :clip_image008

可以被分爲一個超平面:clip_image010

進行歸一化:clip_image012

此時分類間隔等於:clip_image014

即使得:最大間隔最大等價於使clip_image016最小

下面這兩張圖可以看一下,有個感性的認識。那個好?

clip_image018

看下面這張圖:

clip_image020

       下面我們要開始優化上面的式子,因爲推導要用到拉格朗日定理和KKT條件,所以我們先了解一下相關知識。在求取有約束條件的優化問題時,拉格朗日乘子法(Lagrange Multiplier) 和KKT條件是非常重要的兩個求取方法,對於等式約束的優化問題,可以應用拉格朗日乘子法去求取最優值;如果含有不等式約束,可以應用KKT條件去求取。當然,這兩個方法求得的結果只是必要條件,只有當是凸函數的情況下,才能保證是充分必要條件。KKT條件是拉格朗日乘子法的泛化。之前學習的時候,只知道直接應用兩個方法,但是卻不知道爲什麼拉格朗日乘子法(Lagrange Multiplier) 和KKT條件能夠起作用,爲什麼要這樣去求取最優值呢?

拉格朗日乘子法和KKT條件

定義:給定一個最優化問題:

最小化目標函數:clip_image022

制約條件:clip_image024

定義拉格朗日函數爲:

clip_image026

求偏倒方程

clip_image029

可以求得clip_image031的值。這個就是神器拉格朗日乘子法。

上面的拉格朗日乘子法還不足以幫我們解決所有的問題,下面引入不等式約束

最小化目標函數:clip_image022

制約條件變爲:

clip_image033

定義拉格朗日函數爲:

clip_image035

可以列出方程:

clip_image037

新增加的條件被稱爲KKT條件

KKT條件詳解

對於含有不等式約束的優化問題,如何求取最優值呢?常用的方法是KKT條件,同樣地,把所有的不等式約束、等式約束和目標函數全部寫爲一個式子L(a, b, x)= f(x) + a*g(x)+b*h(x),KKT條件是說最優值必須滿足以下條件:

1. L(a, b, x)對x求導爲零;

2. h(x) =0;

3. a*g(x) = 0;

求取這三個等式之後就能得到候選最優值。其中第三個式子非常有趣,因爲g(x)<=0,如果要滿足這個等式,必須a=0或者g(x)=0. 這是SVM的很多重要性質的來源,如支持向量的概念。

二. 爲什麼拉格朗日乘子法(Lagrange Multiplier) 和KKT條件能夠得到最優值?

爲什麼要這麼求能得到最優值?先說拉格朗日乘子法,設想我們的目標函數z = f(x), x是向量, z取不同的值,相當於可以投影在x構成的平面(曲面)上,即成爲等高線,如下圖,目標函數是f(x, y),這裏x是標量,虛線是等高線,現在假設我們的約束g(x)=0,x是向量,在x構成的平面或者曲面上是一條曲線,假設g(x)與等高線相交,交點就是同時滿足等式約束條件和目標函數的可行域的值,但肯定不是最優值,因爲相交意味着肯定還存在其它的等高線在該條等高線的內部或者外部,使得新的等高線與目標函數的交點的值更大或者更小,只有到等高線與目標函數的曲線相切的時候,可能取得最優值,如下圖所示,即等高線和目標函數的曲線在該點的法向量必須有相同方向,所以最優值必須滿足:f(x)的梯度 = a* g(x)的梯度,a是常數,表示左右兩邊同向。這個等式就是L(a,x)對參數求導的結果。(上述描述,我不知道描述清楚沒,如果與我物理位置很近的話,直接找我,我當面講好理解一些,注:下圖來自wiki)。

clip_image038

而KKT條件是滿足強對偶條件的優化問題的必要條件,可以這樣理解:我們要求min f(x), L(a, b, x) = f(x) + a*g(x) + b*h(x),a>=0,我們可以把f(x)寫爲:max_{a,b} L(a,b,x),爲什麼呢?因爲h(x)=0, g(x)<=0,現在是取L(a,b,x)的最大值,a*g(x)是<=0,所以L(a,b,x)只有在a*g(x) = 0的情況下才能取得最大值,否則,就不滿足約束條件,因此max_{a,b} L(a,b,x)在滿足約束條件的情況下就是f(x),因此我們的目標函數可以寫爲 min_x max_{a,b} L(a,b,x)。如果用對偶表達式: max_{a,b} min_x  L(a,b,x),由於我們的優化是滿足強對偶的(強對偶就是說對偶式子的最優值是等於原問題的最優值的),所以在取得最優值x0的條件下,它滿足 f(x0) = max_{a,b} min_x  L(a,b,x) = min_x max_{a,b} L(a,b,x) =f(x0),我們來看看中間兩個式子發生了什麼事情:

f(x0) = max_{a,b} min_x  L(a,b,x) =  max_{a,b} min_x f(x) + a*g(x) + b*h(x) =  max_{a,b} f(x0)+a*g(x0)+b*h(x0) = f(x0)

可以看到上述加黑的地方本質上是說 min_x f(x) + a*g(x) + b*h(x) 在x0取得了最小值,用Fermat定理,即是說對於函數 f(x) + a*g(x) + b*h(x),求取導數要等於零,即

f(x)的梯度+a*g(x)的梯度+ b*h(x)的梯度 = 0

這就是KKT條件中第一個條件:L(a, b, x)對x求導爲零。

而之前說明過,a*g(x) = 0,這時KKT條件的第3個條件,當然已知的條件h(x)=0必須被滿足,所有上述說明,滿足強對偶條件的優化問題的最優值都必須滿足KKT條件,即上述說明的三個條件。可以把KKT條件視爲是拉格朗日乘子法的泛化。

上面跑題了,下面我繼續我們的SVM之旅。

經過拉格朗日乘子法和KKT條件推導之後

最終問題轉化爲:

最大化:clip_image040

條件:

clip_image042

這個是著名的QP問題。決策面:clip_image044其中 clip_image046爲問題的優化解。

鬆弛變量(slack vaviable)

由於在採集數據的過程中,也可能有誤差(如圖)

clip_image048

所以我們引入鬆弛變量對問題進行優化。

clip_image050式子就變爲clip_image052

最終轉化爲下面的優化問題:

clip_image054

其中的C是懲罰因子,是一個由用戶去指定的係數,表示對分錯的點加入多少的懲罰,當C很大的時候,分錯的點就會更少,但是過擬合的情況可能會比較嚴重,當C很小的時候,分錯的點可能會很多,不過可能由此得到的模型也會不太正確。

上面那個個式子看似複雜,現在我帶大家一起推倒一下

……

…(草稿紙上,敲公式太煩人了)

最終得到:

最大化:

clip_image058

條件:

clip_image060

呵呵,是不是感覺和前面的式子沒啥區別內,親,數學就是這麼美妙啊。

這個式子看起來beautiful,但是多數情況下只能解決線性可分的情況,只可以對線性可分的樣本做處理。如果提供的樣本線性不可分,結果很簡單,線性分類器的求解程序會無限循環,永遠也解不出來。但是不怕不怕。我們有殺手鐗還沒有出呢。接着咱要延伸到一個新的領域:核函數。嘻嘻,相信大家都應該聽過這廝的大名,這個東東在60年代就提出來,可是直到90年代纔開始火起來(第二春哈),主要是被Vapnik大大翻出來了。這也說明計算機也要多研讀經典哈,不是說過時了就不看的,有些大師的論文還是有啓發意義的。廢話不多說,又跑題了。

核函數

那到底神馬是核函數呢?

介個咱得先介紹一下VC維的概念。

爲了研究經驗風險最小化函數集的學習一致收斂速度和推廣性,SLT定義了一些指標來衡量函數集的性能,其中最重要的就是VC維(Vapnik-Chervonenkis Dimension)。

VC維定義:對於一個指示函數(即只有0和1兩種取值的函數)集,如果存在h個樣本能夠被函數集裏的函數按照所有可能的2h種形式分開,則稱函數集能夠把h個樣本打散,函數集的VC維就是能夠打散的最大樣本數目。

如果對任意的樣本數,總有函數能打散它們,則函數集的VC維就是無窮大。

看圖比較方便(三個點分類,線性都可分的)。

clip_image062

如果四個點呢?哈哈,右邊的四個點要分爲兩個類,可能就分不啦。

clip_image064

如果四個點,一條線可能就分不過來啦。

一般而言,VC維越大, 學習能力就越強,但學習機器也越複雜。

目前還沒有通用的關於計算任意函數集的VC維的理論,只有對一些特殊函數集的VC維可以準確知道。

N維實數空間中線性分類器和線性實函數的VC維是n+1。

Sin(ax)的VC維爲無窮大。

對於給定的學習函數集,如何計算其VC維是當前統計學習理論研究中有待解決的一個難點問題,各位童鞋有興趣可以去研究研究。

咱們接着要說說爲啥要映射。

例子是下面這張圖:

下面這段來自百度文庫http://wenku.baidu.com/view/8c17ebda5022aaea998f0fa8.html

俺覺得寫的肯定比我好,所以咱就選擇站在巨人的肩膀上啦。

clip_image065

我們把橫軸上端點a和b之間紅色部分裏的所有點定爲正類,兩邊的黑色部分裏的點定爲負類。試問能找到一個線性函數把兩類正確分開麼?不能,因爲二維空間裏的線性函數就是指直線,顯然找不到符合條件的直線。

但我們可以找到一條曲線,例如下面這一條:

clip_image066

顯然通過點在這條曲線的上方還是下方就可以判斷點所屬的類別(你在橫軸上隨便找一點,算算這一點的函數值,會發現負類的點函數值一定比0大,而正類的一定比0小)。這條曲線就是我們熟知的二次曲線,它的函數表達式可以寫爲:

clip_image067

問題只是它不是一個線性函數,但是,下面要注意看了,新建一個向量y和a:

clip_image068

這樣g(x)就可以轉化爲f(y)=<a,y>,你可以把y和a分別迴帶一下,看看等不等於原來的g(x)。用內積的形式寫你可能看不太清楚,實際上f(y)的形式就是:

g(x)=f(y)=ay

在任意維度的空間中,這種形式的函數都是一個線性函數(只不過其中的a和y都是多維向量罷了),因爲自變量y的次數不大於1。

看出妙在哪了麼?原來在二維空間中一個線性不可分的問題,映射到四維空間後,變成了線性可分的!因此這也形成了我們最初想解決線性不可分問題的基本思路——向高維空間轉化,使其變得線性可分。

而轉化最關鍵的部分就在於找到x到y的映射方法。遺憾的是,如何找到這個映射,沒有系統性的方法(也就是說,純靠猜和湊)。具體到我們的文本分類問題,文本被表示爲上千維的向量,即使維數已經如此之高,也常常是線性不可分的,還要向更高的空間轉化。其中的難度可想而知。

爲什麼說f(y)=ay是四維空間裏的函數?

大家可能一時沒看明白。回想一下我們二維空間裏的函數定義
  g(x)=ax+b
變量x是一維的,爲什麼說它是二維空間裏的函數呢?因爲還有一個變量我們沒寫出來,它的完整形式其實是
  y=g(x)=ax+b

  y=ax+b
看看,有幾個變量?兩個。那是幾維空間的函數?
再看看
f(y)=ay
裏面的y是三維的變量,那f(y)是幾維空間裏的函數?

用一個具體文本分類的例子來看看這種向高維空間映射從而分類的方法如何運作,想象一下,我們文本分類問題的原始空間是1000維的(即每個要被分類的文檔被表示爲一個1000維的向量),在這個維度上問題是線性不可分的。現在我們有一個2000維空間裏的線性函數

f(x’)=<w’,x’>+b

注意向量的右上角有個 ’哦。它能夠將原問題變得可分。式中的 w’和x’都是2000維的向量,只不過w’是定值,而x’是變量(好吧,嚴格說來這個函數是2001維的,哈哈),現在我們的輸入呢,是一個1000維的向量x,分類的過程是先把x變換爲2000維的向量x’,然後求這個變換後的向量x’與向量w’的內積,再把這個內積的值和b相加,就得到了結果,看結果大於閾值還是小於閾值就得到了分類結果。

你發現了什麼?我們其實只關心那個高維空間裏內積的值,那個值算出來了,分類結果就算出來了。而從理論上說, x’是經由x變換來的,因此廣義上可以把它叫做x的函數(有一個x,就確定了一個x’,對吧,確定不出第二個),而w’是常量,它是一個低維空間裏的常量w經過變換得到的,所以給了一個w 和x的值,就有一個確定的f(x’)值與其對應。這讓我們幻想,是否能有這樣一種函數K(w,x),他接受低維空間的輸入值,卻能算出高維空間的內積值<w’,x’>?

如果有這樣的函數,那麼當給了一個低維空間的輸入x以後,

g(x)=K(w,x)+b

f(x’)=<w’,x’>+b

這兩個函數的計算結果就完全一樣,我們也就用不着費力找那個映射關係,直接拿低維的輸入往g(x)裏面代就可以了(再次提醒,這回的g(x)就不是線性函數啦,因爲你不能保證K(w,x)這個表達式裏的x次數不高於1哦)。

萬幸的是,這樣的K(w,x)確實存在(發現凡是我們人類能解決的問題,大都是巧得不能再巧,特殊得不能再特殊的問題,總是恰好有些能投機取巧的地方纔能解決,由此感到人類的渺小),它被稱作核函數(核,kernel),而且還不止一個,事實上,只要是滿足了Mercer條件的函數,都可以作爲核函數。核函數的基本作用就是接受兩個低維空間裏的向量,能夠計算出經過某個變換後在高維空間裏的向量內積值。幾個比較常用的核函數,俄,教課書裏都列過,我就不敲了(懶!)。

回想我們上節說的求一個線性分類器,它的形式應該是:

clip_image070

現在這個就是高維空間裏的線性函數(爲了區別低維和高維空間裏的函數和向量,我改了函數的名字,並且給w和x都加上了 ’),我們就可以用一個低維空間裏的函數(再一次的,這個低維空間裏的函數就不再是線性的啦)來代替,

clip_image070

又發現什麼了?f(x’) 和g(x)裏的α,y,b全都是一樣一樣的!這就是說,儘管給的問題是線性不可分的,但是我們就硬當它是線性問題來求解,只不過求解過程中,凡是要求內積的時候就用你選定的核函數來算。這樣求出來的α再和你選定的核函數一組合,就得到分類器啦!

明白了以上這些,會自然的問接下來兩個問題:

1. 既然有很多的核函數,針對具體問題該怎麼選擇?

2. 如果使用核函數向高維空間映射後,問題仍然是線性不可分的,那怎麼辦?

第一個問題現在就可以回答你:對核函數的選擇,現在還缺乏指導原則!各種實驗的觀察結果(不光是文本分類)的確表明,某些問題用某些核函數效果很好,用另一些就很差,但是一般來講,徑向基核函數是不會出太大偏差的一種,首選。(我做文本分類系統的時候,使用徑向基核函數,沒有參數調優的情況下,絕大部分類別的準確和召回都在85%以上。

感性理解,映射圖:

 

clip_image072

 

 

常用的兩個Kernel函數:

多項式核函數:clip_image074

高斯核函數:clip_image076

定義:clip_image078

將核函數帶入,問題又轉化爲線性問題啦,如下:

clip_image080

clip_image082,其中clip_image084

式子是有了,但是如何求結果呢?不急不急,我會帶着大家一步一步的解決這個問題,並且通過動手編程使大家對這個有個問題有個直觀的認識。(PS:大家都對LIBSVM太依賴了,這樣無助於深入的研究與理解,而且我覺得自己動手實現的話會比較有成就感)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章