SVM核函數的選擇對於其性能的表現有至關重要的作用,尤其是針對那些線性不可分的數據,因此核函數的選擇在SVM算法中就顯得至關重要。對於核技巧我們知道,其目的是希望通過將輸入空間內線性不可分的數據映射到一個高緯的特征空間內使得數據在特征空間內是可分的,我們定義這種映射為ϕ(x)ϕ(x) ,那么我們就可以把求解約束最優化問題變為
minαs.t.αi≥0,12∑Ni=1∑Nj=1αiαjyiyj(ϕi⋅ϕj)−∑Ni=1αi∑Ni=1αiyi=0i=1,2,...,Nminα12∑i=1N∑j=1Nαiαjyiyj(ϕi⋅ϕj)−∑i=1Nαis.t.∑i=1Nαiyi=0αi≥0,i=1,2,...,N
但是由於從輸入空間到特征空間的這種映射會使得維度發生爆炸式的增長,因此上述約束問題中內積ϕi⋅ϕjϕi⋅ϕj 的運算會非常的大以至於無法承受,因此通常我們會構造一個核函數
κ(xi,xj)=ϕ(xi)⋅ϕ(xj)κ(xi,xj)=ϕ(xi)⋅ϕ(xj)
從而避免了在特征空間內的運算,只需要在輸入空間內就可以進行特征空間的內積運算。通過上面的描述我們知道要想構造核函數κκ ,我們首先要確定輸入空間到特征空間的映射,但是如果想要知道輸入空間到映射空間的映射,我們需要明確輸入空間內數據的分布情況,但大多數情況下,我們並不知道自己所處理的數據的具體分布,故一般很難構造出完全符合輸入空間的核函數,因此我們常用如下幾種常用的核函數來代替自己構造核函數:
- 線性核函數
κ(x,xi)=x⋅xiκ(x,xi)=x⋅xi線性核,主要用於線性可分的情況,我們可以看到特征空間到輸入空間的維度是一樣的,其參數少速度快,對於線性可分數據,其分類效果很理想,因此我們通常首先嘗試用線性核函數來做分類,看看效果如何,如果不行再換別的 - 多項式核函數
κ(x,xi)=((x⋅xi)+1)dκ(x,xi)=((x⋅xi)+1)d多項式核函數可以實現將低維的輸入空間映射到高緯的特征空間,但是多項式核函數的參數多,當多項式的階數比較高的時候,核矩陣的元素值將趨於無窮大或者無窮小,計算復雜度會大到無法計算。 - 高斯(RBF)核函數
κ(x,xi)=exp(−||x−xi||2δ2)κ(x,xi)=exp(−||x−xi||2δ2)高斯徑向基函數是一種局部性強的核函數,其可以將一個樣本映射到一個更高維的空間內,該核函數是應用最廣的一個,無論大樣本還是小樣本都有比較好的性能,而且其相對於多項式核函數參數要少,因此大多數情況下在不知道用什么核函數的時候,優先使用高斯核函數。 - sigmoid核函數
κ(x,xi)=tanh(η<x,xi>+θ)κ(x,xi)=tanh(η<x,xi>+θ)采用sigmoid核函數,支持向量機實現的就是一種多層神經網絡。
因此,在選用核函數的時候,如果我們對我們的數據有一定的先驗知識,就利用先驗來選擇符合數據分布的核函數;如果不知道的話,通常使用交叉驗證的方法,來試用不同的核函數,誤差最下的即為效果最好的核函數,或者也可以將多個核函數結合起來,形成混合核函數。在吳恩達的課上,也曾經給出過一系列的選擇核函數的方法:
- 如果特征的數量大到和樣本數量差不多,則選用LR或者線性核的SVM;
- 如果特征的數量小,樣本的數量正常,則選用SVM+高斯核函數;
- 如果特征的數量小,而樣本的數量很大,則需要手工添加一些特征從而變成第一種情況。