往簡單裏說,核方法是將一個低維的線性不可分的數據映射到一個高維的空間、並指望映射後的數據在高維空間裏是線性可分的。算法
咱們以異或數據集爲例:在二維空間中、異或數據集是線性不可分的;可是經過將其映射到三維空間、咱們能夠很是簡單地讓其在三維空間中變得線性可分。
好比定義映射:網絡
該映射的效果以下圖所示:
能夠看到,雖然左圖的數據集線性不可分、但顯然右圖的數據集是線性可分的,這就是核工做原理的一個不太嚴謹但仍然合理的解釋ide
從直觀上來講,確實容易想象、同一份數據在越高維的空間中越有可能線性可分,但從理論上是否確實如此呢?函數
1965 年提出的 Cover 定理從理論上解決了這個問題,咱們會在文末附上相應的公式,這裏暫時按下不表學習
至此,彷佛問題就轉化爲了如何尋找合適的映射、使得數據集在被它映射到高維空間後變得線性可分。測試
不過能夠想象的是,現實任務中的數據集要比上文咱們拿來舉例的異或數據集要複雜得多、直接構造一個恰當的的難度甚至可能高於解決問題自己。優化
而核方法的巧妙之處就在於,它能將構造映射這個過程再次進行轉化、從而使得問題變得簡易:它經過核函數來避免顯式定義映射往簡單裏說,核方法會經過用可以表示成
的核函數
替換各算式中出現的內積
來完成將數據從低維映射到高維的過程。3d
換句話說、核方法的思想以下:code
設法找到核函數,它能返回樣本點
、
被
做用後的內積blog
固然了,不難想象的是,並非全部的函數都可以對應一個映射(亦即不是全部的都能拆成
好比說,顯然
至少須要是一個對稱函數)。
幸運的是,1909 年提出的 Mercer 定理解決了這個問題,它的具體敘述會在文末給出。
Mercer 定理爲尋找核函數帶來了極大的便利。能夠證實以下兩族函數都是核函數:
那麼核方法的應用場景有哪些呢?在 2002 年由 Scholkopf 和 Smola 證實的表示定理告訴咱們它的應用場景很是普遍。定理的具體內容一樣會附在文末。
仍是用 GIF 來講明問題最爲形象。
當咱們對感知機應用核方法後,它就能對非線性數據集(好比螺旋線數據集)進行分類了,訓練過程將以下:
簡單來講,就是把算法中涉及到樣本的地方都經過某種變換、弄成樣本的內積形式。以感知機爲例,感知機的原始損失函數爲:
爲了讓損失函數中的樣本都變成內積形式,考慮令
(有沒有發現核形式和對偶形式很像?( σ'ω')σ)
注意:爲簡潔,今後日後的推導和實現均以核感知機爲例,核 SVM 的相關討論會放在下一章介紹 SMO 算法時進行】
簡潔起見,咱們仍是用梯度降低法來進行訓練,爲此咱們須要進行求導工做。假設當前模型參數爲,
在參數
下的預測值爲
,則:
爲了加速訓練,咱們須要將該算式向量化,爲此咱們須要定義核矩陣。假設如今咱們有兩組樣本和
,那麼它們的核矩陣即爲:
對於訓練過程而言,咱們關心的是訓練樣本之間的核矩陣
利用它,不難寫出相應的向量化代碼:
對於預測過程,咱們關心的是原樣本和新樣本之間的核矩陣。假設新樣本爲
,則
那麼預測過程即爲
因而關鍵就在於如何定義計算核矩陣的核函數了。
對於多項式核來講,核函數的實現是直觀的:
但對於 RBF 來講就沒那麼直觀了,用到了 Numpy 的高級實用技巧之一——升維:
固然直接用 for 來實現也是能夠的,不過那將會很是很是慢……
若是思路可以整理清楚,那麼核模型相比原模型來講只有以下兩點改變:
因此實現起來的話會有許多重複代碼,這裏就只展示其中最核心的部分(仍以核感知機爲例):
1)Cover 定理
【注意:一般咱們會稱知足這兩個充要條件之一的函數爲 Mercer 核函數而把核函數定義得更寬泛。
不過若是不打算在理論上深刻太多的話,將 Mercer 核函數簡稱爲核函數是能夠的。
此外,雖然說 Mercer 核函數確實具備 Hilbert 空間中的內積形式、但此時的 Hilbert 空間並不必定具備「維度」這麼好的概念(或說、能夠認爲此時 Hilbert 空間的維度爲無窮大;好比說 RBF 核,它映射後的空間就是無窮維的)】
3)表示定理
這意味着對於任意一個損失函數和一個單調遞增的正則化項組成的優化問題、咱們都可以對其應用核方法
下一篇文章咱們則會拋開梯度降低這個有些「偷懶」的作法,並介紹一種叫序列最小最優化(SMO)的算法
但願觀衆老爺們可以喜歡~
推薦閱讀:
精選乾貨|近半年乾貨目錄彙總----全是通俗易懂的硬貨!歡迎閱讀!
天然語言處理中CNN模型幾種常見的Max Pooling操做
乾貨|很是詳細的神經網絡入門解釋
歡迎關注公衆號學習交流~