核函數:RBF 是如何讓線性 SVM 可以分類非線性數據的?
1. 線性支持向量機
支持向量機的思想就是給定訓練樣本集 ,在樣本空間中找到一個劃分的超平面,例如下圖:
但如果遇到某一些數據,並沒有這麼容易可以用一個平面分隔開,像如下的環形數據:
現實中非線性的數據還是很多數的,而解非線性問題要遠比線性問題複雜得多,花費的資源也會成倍的增加,爲此我們使用了核技巧(kernel trick)。
2. 核函數
如果原始空間是有限維,即屬性數有限,那麼一定存在一個高維特徵空間使得樣本可分。1
簡單地講,就是把數據映射到一個更加高維的空間,讓數據在此高維空間上的映射線性可分。文字可能不太容易懂,看圖的話,我們會比較直觀。
還是如上面的環形數據,利用了核函數映射後在三維空間上的分佈,如下圖所示:
利用 scikit-learn 計算的關於原點 (0, 0) 的 RBF(高斯)映射,結尾會附上代碼。
不難看出,在這個三維空間上的點,能夠簡單的用一個平面就分隔開,這樣就避免瞭解非線性問題。
2.1. 徑向基函數(Radial Basis Function)
所謂徑向基函數,就是某種沿徑向對稱的標量函數。 通常定義爲空間中任一點 到某一中心 之間歐氏距離的單調函數。 越遠離中心,函數的取值就越小。2
一般 RBF 核又指高斯核,其形式爲:
其中 爲高斯核的帶寬(其實意義與高斯分佈的差不多), 就是第 個數據。
2.2. 計算核函數
計算核函數可以使用 sklearn 的 sklearn.metrics.pairwise.rbf_kernel
來計算:(具體的代碼,可以在我的 Github 上下載,如果對你有幫助,希望可以給我個 star。)
>>> from sklearn.metrics import pairwise
>>> # draw circles data
>>> X, y = make_circles(100, factor=.1, noise=.1)
>>> # calculate the rbf (gaussian) kernel between X and (0, 0)
>>> K = pairwise.rbf_kernel(X, np.array([[0, 0]]))
>>> print(K)
[[0.58581766]
[0.74202632]
...
[0.63660304]
[0.98952965]]
利用這種變換,我們就可以用 SVM 在數據之間找到一個可以把兩個類別區分開來的平面了: