非線性SVM-重要參數kernel

非線性SVM的決策函數:
在這裏插入圖片描述
將數據從原始的空間投射到新空間中,這種變換非常巧妙,但也帶有一些實現問題。
首先,我們可能不清楚應該什麼樣的數據應該使用什麼類型的映射函數來確保可以在變換空間中找出線性決策邊界。極端情況下,數據可能會被映射到無限維度的空間中,這種高維空間可能不是那麼友好,維度越多,推導和計算的難度都會隨之暴增。其次,即使已知適當的映射函數,我們想要計算類似於Φ(xi)Φ(xtest)\Phi(x_i)\cdot\Phi(x_{test})這樣的點積,計算量可能會無比巨大,要找出超平面所付出的代價是非常昂貴的。
爲了解決上述問題,我們引入了一個關鍵概念——核函數(Kernel Function)。解決上述問題的數學方式,叫做**“核技巧”(Kernel Trick),是一種能夠使用數據原始空間中的向量計算來表示升維後的空間中的點積結果的數學方式**。具體表現爲K(u,v)=Φ(u)Φ(v)K(u,v)=\Phi(u)\cdot\Phi(v) 。而這個原始空間中的點積函數K(u,v),就被叫做“核函數”
核函數能夠幫助我們解決三個問題:
第一,有了核函數之後,我們無需去擔心Φ\Phi究竟應該是什麼樣,因爲非線性SVM中的核函數都是正定核函數(positive definite kernel functions),他們都滿足美世定律(Mercer’s theorem),確保了高維空間中任意兩個向量的點積一定可以被低維空間中的這兩個向量的某種計算來表示(多數時候是點積的某種變換)
第二,使用核函數計算低維度中的向量關係比計算原本的Φ(xi)Φ(xtest)\Phi(x_i)\cdot\Phi(x_{test})要簡單太多了。
第三,因爲計算是在原始空間中進行,所以避免了維度詛咒的問題。
選用不同的核函數,就可以解決不同數據分佈下的尋找超平面問題。在SVC中,這個功能由參數“kernel”和一系列與核函數相關的參數來進行控制。之前的代碼中我們一直使用這個參數並輸入"linear",但卻沒有給大家詳細講解,也是因爲如果不先理解核函數本身,很難說明這個參數到底在做什麼。參數“kernel"在sklearn中可選以下幾種選項:
在這裏插入圖片描述
可以看出,除了選項"linear"之外,其他核函數都可以處理非線性問題。多項式核函數有次數d,當d爲1的時候它就是在處理線性問題,當d爲更高次項的時候它就是在處理非線性問題。我們之前畫圖時使用的是選項“linear",自然不能處理環形數據這樣非線性的狀況。而剛纔我們使用的計算r的方法,其實是高斯徑向基核函數所對應的功能,在參數”kernel“中輸入”rbf“就可以使用這種核函數。我們來看看模型找出的決策邊界時什麼樣:

clf = SVC(kernel = "rbf").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plot_svc_decision_function(clf)

可以看到,決策邊界被完美地找了出來。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章