1. 程式人生 > >SVM全系列:從原理到python實現(一):SVM原理

SVM全系列:從原理到python實現(一):SVM原理

前言

本文開始主要介紹一下SVM的分類原理以及SVM的數學匯出和SVM在Python上的實現。借鑑了許多文章,會在後面一一指出,如果有什麼不對的希望能指正。

一、 SVM簡介

首先看到SVM是在斯坦福的機器學習課程上,SVM是作為分類器在logisticregression的基礎上引出的。其學習方法是把資料對映到一個高維空間上,使資料變稀疏,比較容易找到一個分割面來將資料分類,而這個高維的分割面就是超平面。而SVM做的就是找到這樣一個超平面使得資料點離這個超平面儘可能的遠,這樣的分類效果才會好。

1、SVM起源Logistic迴歸(邏輯迴歸)

我也準備利用邏輯迴歸來引出SVM。首先我們要先理解什麼是線性分類器

,線性分類器就是通過特徵的線性組合作為自變數,由於自變數的取值範圍是負無窮到正無窮,因此通過sigmoid函式(這個函式的主要目的就是為了對映)對映到(0,1)上,得到屬於y =1的概率,概率超過50%就定義為y=1。Logistic迴歸就是要學習得到θ,使得正例的特徵遠大於0,負例的特徵遠小於0,而且要在全部訓練例項上達到這個目標。這就是最簡單的一個線性分類過程,關於Logistic的詳細過程請看我的其他博文。

2、SVM的分類思想


為了看起來方便我們將SVM的思想從一個二維的空間解釋,上面的紅綠點表示了兩類資料,我們可以發現有很多的線(高維就是超平面)都可以將這兩類分開,但是哪一種才是最好的呢?SVM想的是找到這樣一個超平面:儘量使得正例反例之間的間隔最大,只希望離這個超平面近的點離平面越遠越好,而不用所有點都離超平面很遠,簡單說就是隻考慮區域性就可以了。那麼怎麼衡量這個間隔呢?就是求點到面的距離就可以。

3、為了引出SVM需要進行變形(本質上是為了看起來方便)

可以看出其實SVM也是一個找線性組合的係數的過程,因為係數的本質就是這個超平面。為了進行SVM的計算我們要對Logistic提出的模型進行一些調整:

(1)把分類標籤從(0,1)變到了(-1,1)(為什麼後面會提到)

(2)將係數替換成w和b。 認為並替換為b,其他的變為w,也就是

(3)改變了對映函式: ,g()就是上面提到的對映函式,變成下面這種:

       對映函式的目的就是為了讓結果看上去更規整,其實真正起決定意義的還是的正負決定了分類結果。所以簡單的將對映函式定義為-1或是+1也就是說,現在除了標籤變化外,與logistic迴歸並沒什麼太大區別。

4、間隔的計算

經過了上面的一些轉換,我們開始嘗試計算間隔。好多文章在講解這一部分的時候都是講了函式間隔(functional margin)和幾何間隔(geometric margin),我個人感覺這樣講有點捨近求遠。

首先先用一個例子先把函式都表示出來。下面是一個分類表達的圖,超平面可以用一個分類函式表示,f(x) =0表示x是處於超平面上的點,通過對映函式對映f(x)大於0被對映為y=+1,小於0則對映為y=-1。怎麼表示分類正確呢?很明顯只要y* f(x)是正的就可以了。

 

有了這個超平面的表示式我們就可以利用學過的知識計算點到平面的距離了。


把上面的公式去掉絕對值,定義到高維空間不難看出這其實就是:

    
為了達到上面公式中的絕對值效果,只要乘上y就可以了也就是:


上式得到的就是幾何間隔,也就是點到平面的距離。分子上的就是函式間隔

5、最優間隔分類器(optimal margin classifier)

我們已經得到了點到超平面距離的公式了,接下來就只要找到那個能夠分割的超平面就可以了。前面已經說過,

只要資料點中離超平面最近的這個點離超平面遠就可以(也就是其他點更遠)。這其實是兩個條件,一個是要max這

個最近距離,另一個約束條件是定義離超平面最近的點。

第一個目標函式可以定義為:

   

約束條件可以定義為:

這裡解釋一下這個約束條件,因為所有點對應的是同一個超平面,相對的w和b是不變的,所以只要比較函式

間隔就可以了。

進一步通過變數替換約束條件兩邊同時除以函式間隔也就是:


經過變換推倒一下,其實這個就是其他文章經常說的可以令函式間隔為1的原因,其實目的就是為了簡化計算。

再將目標函式經過取倒數、平方等等價計算,這樣就推出我們常見的SVM的格式:


這樣的變化相對於前面未變化的表達來說有一個好處:這樣是個典型的二次規劃問題(目標函式是自變數的二次函式)

,就可以用軟體求解了。

上面所有總結為下面的直觀的表示,中間的實線就是尋找到的最優超平面,超平面到兩條虛線的距離相等,

這個距離就是我們幾何間隔,而虛線上的點就是我們說的支援向量,我們看出這些支援向量滿足

(在函式間隔定義為1的情況下),而對於不是支援向量的點,滿足約束條件,這時也看出來當時定

義標籤為+1和-1比較直觀。


注:我們雖然定義了標籤為+1,-1但也不是必須這樣,比如我們定義標籤為a和b,但是隻要對約束條件進行相應變化

就好將上面公式中提到的y變為

(y-(a+b)/2)*((b-a)/2)

就可以了,其實並沒有什麼本質改變。

主要參考了:

http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html

http://blog.csdn.net/v_july_v/article/details/7624837      (最全面)

http://blog.csdn.net/zouxy09/article/details/17291543