前面我們介紹了線性情況下的支持向量機,它通過尋找一個線性的超平面來達到對數據進行分類的目的。不過,由於是線性方法,所以對非線性的數據就沒有辦法處理了。例如圖中的兩類數據,分別分佈爲兩個圓圈的形狀,不論是任何高級的分類器,只要它是線性的,就沒法處理,SVM 也不行。因爲這樣的數據本身就是線性不可分的。
對於這個數據集,我可以悄悄透露一下:我生成它的時候就是用兩個半徑不同的圓圈加上了少量的噪音得到的,所以,一個理想的分界應該是一個“圓圈”而不是一條線(超平面)。如果用
注意上面的形式,如果我們構造另外一個五維的空間,其中五個座標的值分別爲
關於新的座標
再進一步描述 Kernel 的細節之前,不妨再來看看這個例子映射過後的直觀例子。當然,我沒有辦法把 5 維空間畫出來,不過由於我這裏生成數據的時候就是用了特殊的情形,具體來說,我這裏的超平面實際的方程是這個樣子(圓心在
因此我只需要把它映射到
現在讓我們再回到 SVM 的情形,假設原始的數據時非線性的,我們通過一個映射
現在則是在映射過後的空間,即:
而其中的 α 也是通過求解如下 dual 問題而得到的:
這樣一來問題就解決了嗎?似乎是的:拿到非線性數據,就找一個映射
不妨還是從最開始的簡單例子出發,設兩個向量
另外,我們又注意到:
二者有很多相似的地方,實際上,我們只要把某幾個維度線性縮放一下,然後再加上一個常數維度,具體來說,上面這個式子的計算結果實際上和映射
之後的內積
我們把這裏的計算兩個向量在映射過後的空間中的內積的函數叫做核函數 (Kernel Function) ,例如,在剛纔的例子中,我們的核函數爲:
核函數能簡化映射空間中的內積運算——剛好“碰巧”的是,在我們的 SVM 裏需要計算的地方數據向量總是以內積的形式出現的。對比剛纔我們寫出來的式子,現在我們的分類函數爲:
其中
這樣一來計算的問題就算解決了,避開了直接在高維空間中進行計算,而結果卻是等價的,實在是一件非常美妙的事情!當然,因爲我們這裏的例子非常簡單,所以我可以手工構造出對應於
最理想的情況下,我們希望知道數據的具體形狀和分佈,從而得到一個剛好可以將數據映射成線性可分的
然而,第二步通常是非常困難甚至完全沒法做的。不過,由於第一步也是幾乎無法做到,因爲對於任意的數據分析其形狀找到合適的映射本身就不是什麼容易的事情,所以,人們通常都是“胡亂”選擇映射的,所以,根本沒有必要精確地找出對應於映射的那個核函數,而只需要“胡亂”選擇一個核函數即可——我們知道它對應了某個映射,雖然我們不知道這個映射具體是什麼。由於我們的計算只需要核函數即可,所以我們也並不關心也沒有必要求出所對應的映射的具體形式。 :D
當然,說是“胡亂”選擇,其實是誇張的說法,因爲並不是任意的二元函數都可以作爲核函數,所以除非某些特殊的應用中可能會構造一些特殊的核(例如用於文本分析的文本核,注意其實使用了 Kernel 進行計算之後,其實完全可以去掉原始空間是一個向量空間的假設了,只要核函數支持,原始數據可以是任意的“對象”——比如文本字符串),通常人們會從一些常用的核函數中選擇(根據問題和數據的不同,選擇不同的參數,實際上就是得到了不同的核函數),例如:
- 多項式核
κ(x1,x2)=(⟨x1,x2⟩+R)d ,顯然剛纔我們舉的例子是這裏多項式核的一個特例(R=1,d=2 )。雖然比較麻煩,而且沒有必要,不過這個核所對應的映射實際上是可以寫出來的,該空間的維度是(m+dd) ,其中m 是原始空間的維度。 - 高斯核
κ(x1,x2)=exp(−∥x1−x2∥22σ2) ,這個核就是最開始提到過的會將原始空間映射爲無窮維空間的那個傢伙。不過,如果 σ 選得很大的話,高次特徵上的權重實際上衰減得非常快,所以實際上(數值上近似一下)相當於一個低維的子空間;反過來,如果 σ 選得很小,則可以將任意的數據映射爲線性可分——當然,這並不一定是好事,因爲隨之而來的可能是非常嚴重的過擬合問題。不過,總的來說,通過調控參數 σ ,高斯覈實際上具有相當高的靈活性,也是使用最廣泛的核函數之一。 - 線性核
κ(x1,x2)=⟨x1,x2⟩ ,這實際上就是原始空間中的內積。這個核存在的主要目的是使得“映射後空間中的問題”和“映射前空間中的問題”兩者在形式上統一起來了。
最後,總結一下:對於非線性的情況,SVM 的處理方法是選擇一個核函數
此外,略微提一下,也有不少工作試圖自動構造專門針對特定數據的分佈結構的核函數,感興趣的同學可以參考,比如 NIPS 2003 的 Cluster Kernels for Semi-Supervised Learning 和 ICML 2005 的 Beyond the point cloud: from transductive to semi-supervised learning 等。