SVM的核函數如何選取?

常用的核函數有那麼幾個,我也是從書本中了解的,沒什麼經驗。我這裡比較好奇,通常的SVM工具包如何設定核函數呢?枚舉取效果最好的?


在我的工作中,最常用的是Linear核與RBF核。

1. Linear核:主要用於線性可分的情形。參數少,速度快,對於一般數據,分類效果已經很理想了。

2. RBF核:主要用於線性不可分的情形。參數多,分類結果非常依賴於參數。有很多人是通過訓練數據的交叉驗證來尋找合適的參數,不過這個過程比較耗時。我個人的體會是:使用libsvm,默認參數,RBF核比Linear核效果稍差。通過進行大量參數的嘗試,一般能找到比linear核更好的效果。

至於到底該採用哪種核,要根據具體問題,有的數據是線性可分的,有的不可分,需要多嘗試不同核不同參數。如果特徵的提取的好,包含的信息量足夠大,很多問題都是線性可分的。當然,如果有足夠的時間去尋找RBF核參數,應該能達到更好的效果。


SVM關鍵是選取核函數的類型,主要有線性內核,多項式內核,徑向基內核(RBF),sigmoid核。

這些函數中應用最廣的應該就是RBF核了,無論是小樣本還是大樣本,高維還是低維等情況,RBF核函數均適用,它相比其他的函數有一下優點:

1)RBF核函數可以將一個樣本映射到一個更高維的空間,而且線性核函數是RBF的一個特例,也就是說如果考慮使用RBF,那麼就沒有必要考慮線性核函數了。

2)與多項式核函數相比,RBF需要確定的參數要少,核函數參數的多少直接影響函數的複雜程度。另外,當多項式的階數比較高時,核矩陣的元素值將趨於無窮大或無窮小,而RBF則在上,會減少數值的計算困難。

3)對於某些參數,RBF和sigmoid具有相似的性能。


我用的是台灣大學開發的libSVM,裡面option-t是用來選擇核函數的,一般2是默認的核函數,如果不選option t的話就是這個,效果還可以,1是polynomial,多項分類,需要你在訓練樣本中提前準備好多個label,以便後面分類有一個標答。

4是自己設定的kernel function,如果你自己的code里應用了核函數的話就不必用以上的選項,可以直接用輸出的數值(distance或者similarity)來進行訓練。

0 -- linear: u"*v

1 -- polynomial: (gamma*u"*v + coef0)^degree

2 -- radial basis function: exp(-gamma*|u-v|^2)

3 -- sigmoid: tanh(gamma*u"*v + coef0)

4 -- precomputed kernel (kernel values in training_set_file)


一般用線性核和高斯核,也就是Linear核與RBF核

需要注意的是需要對數據歸一化處理,很多使用者忘了這個小細節

然後一般情況下RBF效果是不會差於Linear

但是時間上RBF會耗費更多,其他同學也解釋過了

下面是吳恩達的見解:

1. 如果Feature的數量很大,跟樣本數量差不多,這時候選用LR或者是Linear Kernel的SVM

2. 如果Feature的數量比較小,樣本數量一般,不算大也不算小,選用SVM+Gaussian Kernel

3. 如果Feature的數量比較小,而樣本數量很多,需要手工添加一些feature變成第一種情況


難道大家不都是試所有的核函數,看那個效果好。就說自己的數據是適合哪種核函數的數據分布特性的么。


記口訣:

初級

高維用線性,不行換特徵;低維試線性,不行換高斯

中級

線性試試看,不行換高斯,卡方有奇效,絕招MKL

玩家

Kernel度量相似性,自己做啊自己做


一般我們用的R裡面的e1071包的svm函數和python的scikit-learn包里的svm函數都是基於libsvm實現的:http://www.csie.ntu.edu.tw/~cjlin/libsvm/libsvm

libsvm提供了下列幾個核函數:

linear:

u"*v

polynomial:

(gamma*u"*v + coef0)^degree

radial basis:

exp(-gamma*|u-v|^2)

sigmoid:

tanh(gamma*u"*v + coef0)

通常來說,個人經驗RBF kernel是第一選擇,幾乎效果都是最好的。

此外,linear kernel也有用武之地,(其實linear kernel本身就是RBF的一種特殊情況),因為當features的數量很多的時候,linear kernel的速度優勢比較明顯。

當然有時間當然最好是都試一遍,看看哪個更符合自己的數據分布特性了。


直接看libsvm作者自己寫的guide吧:

A Practical Guide to Support Vector Classification

https://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

一般來說先用RBF kernel

3.1里有講,簡單說一下就是:

  1. RBF kernel可以處理非線性的情況,linear kernel可以是RBF kernel的特殊情況,sigmoid kernel又在某些參數下和RBF很像
  2. polynomial kernel的參數比RBF多,而參數越多模型越複雜
  3. RBF kernel更方便計算,取值在[0,1];而用polynomial kernel取值範圍是(0,inf),在自由度高的情況下更凸顯出劣勢;至於sigmoid,它可能在某些參數下是無效的

當然有些情況下用linear kernel就好了,比如特徵維數很高的時候。

私以為無論新手還是之前接觸過SVM,看一看那篇guide都會有幫助,非常pragmatic。


我們先看幾張圖

分別選用了linear, rbf, poly。

就擬合程度來講,linear在線性可分的情況下和rbf想過差不多,在線性不可分的情況下rbf明顯優於linear,poly在前兩種情況下效果都不怎麼好,但是在變化劇烈的情況下ploy稍微好點。

就速度來講,linear肯定是最快的,poly的話因為參數很多,測試中最慢。

就參數而言,linear簡單易用,rbf, poly參數較多,但是調參好的話可以得到較好的結果。

還是需要看情況選擇吧。


看到別人的答案里提到了吳恩達給出的選擇核函數的方法,關於那三點,我的理解是:

(1)如果特徵維數很高,往往線性可分(SVM解決非線性分類問題的思路就是將樣本映射到更高維的特徵空間中),可以採用LR或者線性核的SVM;

(2)如果樣本數量很多,由於求解最優化問題的時候,目標函數涉及兩兩樣本計算內積,使用高斯核明顯計算量會大於線性核,所以手動添加一些特徵,使得線性可分,然後可以用LR或者線性核的SVM;

(3)如果不滿足上述兩點,即特徵維數少,樣本數量正常,可以使用高斯核的SVM。


可以試試 pGMM 核函數.

http://www.stat.rutgers.edu/home/pingli/papers/epGMM.pdf


混合核函數


推薦閱讀:

SVM(支持向量機)屬於神經網路範疇嗎?
現在還有必要對SVM深入學習嗎?

TAG:SVM | kernel核函數 |