SVM 支持向量機算法介紹


轉自:https://zhuanlan.zhihu.com/p/21932911?refer=baina

參考:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html     

           http://blog.csdn.net/v_july_v/article/details/7624837

 

SVM(支持向量機)主要用於分類問題,主要的應用場景有字符識別、面部識別、行人檢測、文本分類等領域。

通常SVM用於二元分類問題,對於多元分類通常將其分解為多個二元分類問題,再進行分類。下面我們首先討論一下二元分類問題。

  1. 線性可分數據集與線性不可分數據集

 

對於二元分類問題,如果存在一個分隔超平面能夠將不同類別的數據完美的分隔開(即兩類數據正好完全落在超平面的兩側),則稱其為線性可分。反之,如果不存在這樣的超平面,則稱其為線性不可分。

所謂超平面,是指能夠將n維空間划分為兩部分的分隔面,其形如w^Tx+b=0。簡單來說,對於二維空間(指數據集有兩個特征),對應的超平面就是一條直線;對於三維空間(指數據集擁有三個特征),對應的超平面就是一個平面。可以依次類推到n維空間。

在下面的圖片中,左邊的圖表示二維空間的一個線性可分數據集,右圖表示的是二維空間的一個線性不可分數據集。可以直觀的看到,對於左圖,我們很容易找到這樣一條直線將紅色點和藍色點完全分隔開。但是對於右圖,我們無法找到這樣的直線。

線性不可分出現的原因:

(1)數據集本身就是線性不可分隔的。上圖中右圖就是數據集本身線性不可分的情況。這一點沒有什么疑問,主要是第二點。

(2)由於數據集中存在噪聲,或者人工對數據賦予分類標簽出錯等情況的原因導致數據集線性不可分。下圖展示的就是由於噪聲或者分錯出錯導致線性不可分的情況。

現在,只關注圖中的實心點、空心點,以及綠色線段。可以看到實心點和空心點大致分布在綠色線段的兩側,但是在實心點的一側混雜了兩個空心點,在空心點的一側混雜了一個實心點,即此時綠色直線並沒有完全將數據分為兩類,即該數據集是線性不可分的。在后面我們會提到通過修正線性可分模型以使得模型能夠“包容”數據集中的噪點,以使得SVM能夠處理這種類型的線性不可分情況。

SVM的目標就是找到這樣的一個超平面(對於上圖來說,就是找到一條直線),使得不同類別的數據能夠落在超平面的兩側。

2. 分類效果好壞

對於線性可分數據集,有時我們可以找到無數多條直線進行分隔,那么如何判斷哪一個超平面是最佳的呢?

我們先來看一個簡單的例子。圖中‘x’和‘o’分別代表數據的兩種不同類型。可以看到存在圖中這樣一條直線將數據划分成兩類。對於圖中的A、B、C三點,雖然它們都被划分在了‘x’類,但是我們A、B、C真正屬於‘x’類的把握卻是不一樣的,直覺上我們認為有足夠大的把握A點確實屬於'x'類,但是對於C點我們卻沒有足夠的把握,因為圖中分隔直線的稍稍偏離,C點有可能就被划分到了直線的另一側。

所以,SVM的目標是使得訓練集中的所有數據點都距離分隔平面足夠遠,更確切地說是,使距離分隔平面最近的點的距離最大。

3. 距離衡量標准

上面提到了SVM的中心思想,即,使距離分隔平面最近的點的距離最大。那么這個距離如何衡量呢?

通常采用幾何間隔作為距離度量的方式。簡單來說,就是點到超平面的幾何距離。

例如,在上圖的二維空間中,點A到分隔超平面(直線)的距離即為線段AB的長度。

幾何間隔的計算公式如下:

其中,y表示數據點的類別標簽,w和b分別是超平面w^Tx+b=0的參數。

注:

(1)在SVM的二元分類中,通常將數據分為“1”類(也稱為正類或正例)和“-1”類(也稱為負類負例)。通常對於數據點x_0,如果w^Tx_0+b>0,則其被分為正類,反之,如果w^Tx+b<0則被分為負類。那么通過在幾何間隔的計算中加入乘法因子y,即可保證只要數據點被分在了正確的類別,那么其幾何間隔一定是一個正值。

(2)其中y^{(i)}(w^Tx+b)通常也稱為函數間隔。當w的模||w||等於1時,函數間隔和幾何間隔相等。函數間隔存在的一個問題是:等比放大w和b,函數間隔也會等比增大,而分隔超平面卻不會發生變化。幾何間隔可以看做是函數間隔的“正規化”。幾何間隔不會隨着w和b的等比縮放而變化。

4. 支持向量的概念和最優間隔分類器

所謂SVM,即支持向量機,那么到底什么是支持向量呢?

如下圖所示,實心點和空心點分別代表數據的兩種類別,他們被黃色區域中間的直線分隔成兩部分。被藍色和紅色圓圈圈出的點即為支持向量。所謂支持向量,就是指距離分隔超平面最近的點。

那么:要最大化最近的點到分隔超平面的距離,就是最大化支持向量到超平面的距離。

則我們要優化的目標就是:

這就是最大間隔分類器的模型,也是SVM的雛形,其可以利用二次優化軟件(QP)直接求解。但是計算效率不高(甚至可以說非常低)。

5.通過拉格朗日對偶法優化最優間隔分類器模型

為了提高計算效率以及方便使用核函數,采用拉格朗日對偶,將原始優化模型變成了如下對偶形式:

公式的推導非常復雜,這里也不再贅述,詳細參考后面給出的資料。

這里只需要知道alpha僅在支持向量處為非零值。也就是說實際計算時,公式右邊有大量零值,非常節省計算量。

6. 模型修正和線性不可分的處理

在第二部分,我們提到:在分類問題中,並不是訓練集的分類函數越“完美”越好,因為數據集中本來就存在噪聲,且可能存在人工添加分類標簽出錯的情況。過於“完美”反而會導致過擬合,使得模型失去一般性(可推廣性)。

為了修正這些分類錯誤的情況,需要修正模型,加上懲罰系數C。其中\varepsilon 表示錯誤分類的點到正確邊界的距離。(即圖中的紫色線段長度)

修正后的模型,可以“容忍”模型錯誤分類的情況,並且通過懲罰系數的約束,使得模型錯誤分類的情況盡可能合理。

7.核函數

在線性不可分的情況下的另一種處理方式是使用核函數,其基本思想是:將原本的低維特征空間映射到一個更高維的特征空間,從而使得數據集線性可分。



在上面的圖中,左側的圖是一個二維特征空間中的線性不可分數據集,其具有兩個特征(x1,x2)。

通過特征映射:

我們可以得到右側的圖,其是一個三維特征空間中的線性可分數據集,具有三個特征(z1,z2,z3)。

即:我們通過特征映射,將一個二維的線性不可分數據集成功映射到了三維空間的線性可分數據集。

關於核函數有一個形象的解釋:世界上本來沒有兩個完全一樣的物體,對於所有的兩個物體,我們可以通過增加維度來讓他們最終有所區別,比如說兩本書,從(顏色,內容)兩個維度來說,可能是一樣的,我們可以加上作者這個維度,是在不行我們還可以加入頁碼,可以加入 擁有者,可以加入 購買地點,可以加入 筆記內容等等。當維度增加到無限維的時候,一定可以讓任意的兩個物體可分了。

這與核函數將低維特征映射到高維特征的思想基本類似。

常用的核函數有:

(1)多項式核函數

(2)高斯核函數

那么如何應用核函數呢?


回顧上面我們構建的模型:

注意到公式紅色部分,表示兩個x_ix_j做內積,要應用核函數,我們只需要將這個部分替換為對應的核函數即可。

核函數的本質

        上面說了這么一大堆,讀者可能還是沒明白核函數到底是個什么東西?我再簡要概括下,即以下三點:
  1. 實際中,我們會經常遇到線性不可分的樣例,此時,我們的常用做法是把樣例特征映射到高維空間中去(如上文2.2節最開始的那幅圖所示,映射到高維空間后,相關特征便被分開了,也就達到了分類的目的);
  2. 但進一步,如果凡是遇到線性不可分的樣例,一律映射到高維空間,那么這個維度大小是會高到可怕的(如上文中19維乃至無窮維的例子)。那咋辦呢?
  3. 此時,核函數就隆重登場了,核函數的價值在於它雖然也是將特征進行從低維到高維的轉換,但核函數絕就絕在它事先在低維上進行計算,而將實質上的分類效果表現在了高維上,也就如上文所說的避免了直接在高維空間中的復雜計算。

8. SMO算法

 

SMO算法就是為了高效計算上述優化模型而提出的。其是由坐標上升算法衍生而來。

所謂坐標上升算法,就是指:對於含有多個變量的優化問題:每次只調整一個變量,而保證其他變量不變,來對模型進行優化,直到收斂。

舉一個最簡單的例子,對於如下優化問題:

從任意點開始應用坐標上升算法,結果都會收斂到(0,0)。

不妨假設我們選擇初始點(5,8),首先我們只調整x1的值,而保證x2的值不變,得到解(0,8);然后我們只調整x2的值,而保證x1的值不變,得到解(0,0);進一步,我們再次只調整x1的值,而保證x2的值不變,發現結果仍然是(0,0),說明收斂,算法結束,最終結果為(0,0)。

SMO的思想類似,由於約束條件 \sum_{i=1}^{m}{\alpha _iy^{(i)}} 的存在,如果按照坐標上升算法,每次只修改一個\alpha 的值,是不可行的(因為\alpha 的值完全取決於剩下的m-1個\alpha 值)。所以每次至少改變一對a的值。

因而,類似坐標上升,SMO算法每次選擇一對可以進行優化的a值進行優化,直到收斂

 

支持向量機高斯核調參

在支持向量機(以下簡稱SVM)的核函數中,高斯核(以下簡稱RBF)是最常用的,從理論上講, RBF一定不比線性核函數差,但是在實際應用中,卻面臨着幾個重要的超參數的調優問題。如果調的不好,可能比線性核函數還要差。所以我們實際應用中,能用線性核函數得到較好效果的都會選擇線性核函數。如果線性核不好,我們就需要使用RBF,在享受RBF對非線性數據的良好分類效果前,我們需要對主要的超參數進行選取。

如果是SVM分類模型,這兩個超參數分別是懲罰系數C和RBF核函數的系數  γ。當然如果是nu-SVC的話,懲罰系數代替為分類錯誤率上限nu, 由於懲罰系數和分類錯誤率上限nu起的作用等價,因此本文只討論帶懲罰系數C的分類SVM。

  懲罰系數即我們在之前原理篇里講到的松弛變量的系數。它在優化函數里主要是平衡支持向量的復雜度和誤分類率這兩者之間的關系,可以理解為正則化系數。當比較大時,我們的損失函數也會越大,這意味着我們不願意放棄比較遠的離群點。這樣我們會有更加多的支持向量,也就是說支持向量和超平面的模型也會變得越復雜,也容易過擬合。反之,當比較小時,意味我們不想理那些離群點,會選擇較少的樣本來做支持向量,最終的支持向量和超平面的模型也會簡單。scikit-learn中默認值是1。

  另一個超參數是RBF核函數的參數 γ。回憶下RBF 核函數   γ主要定義了單個樣本對整個分類超平面的影響,當γ  比較小時,單個樣本對整個分類超平面的影響比較大,更容易被選擇為支持向量,反之,當 γ比較大時,單個樣本對整個分類超平面的影響比較小,不容易被選擇為支持向量,或者說整個模型的支持向量也會少。scikit-learn中默認值是 

 

  如果把懲罰系數和RBF核函數的系數 γ一起看,當比較大,  γ比較小時,我們會有更多的支持向量,我們的模型會比較復雜,容易過擬合一些。如果比較小 ,  γ比較大時,模型會變得簡單,支持向量的個數會少。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM