Python.SVM(三)核方法

Python.SVM(三)核方法

1

什麼是核方法

往簡單裏說,核方法是將一個低維的線性不可分的數據映射到一個高維的空間、並指望映射後的數據在高維空間裏是線性可分的。算法

咱們以異或數據集爲例:在二維空間中、異或數據集是線性不可分的;可是經過將其映射到三維空間、咱們能夠很是簡單地讓其在三維空間中變得線性可分。
好比定義映射:Python.SVM(三)核方法網絡

該映射的效果以下圖所示:
Python.SVM(三)核方法
能夠看到,雖然左圖的數據集線性不可分、但顯然右圖的數據集是線性可分的,這就是核工做原理的一個不太嚴謹但仍然合理的解釋ide

從直觀上來講,確實容易想象、同一份數據在越高維的空間中越有可能線性可分,但從理論上是否確實如此呢?函數

1965 年提出的 Cover 定理從理論上解決了這個問題,咱們會在文末附上相應的公式,這裏暫時按下不表學習

至此,彷佛問題就轉化爲了如何尋找合適的映射、使得數據集在被它映射到高維空間後變得線性可分。測試

不過能夠想象的是,現實任務中的數據集要比上文咱們拿來舉例的異或數據集要複雜得多、直接構造一個恰當的的難度甚至可能高於解決問題自己。優化

而核方法的巧妙之處就在於,它能將構造映射Python.SVM(三)核方法這個過程再次進行轉化、從而使得問題變得簡易:它經過核函數來避免顯式定義映射往簡單裏說,核方法會經過用可以表示成Python.SVM(三)核方法的核函數Python.SVM(三)核方法替換各算式中出現的內積Python.SVM(三)核方法來完成將數據從低維映射到高維的過程。3d

換句話說、核方法的思想以下:code

  • 將算法表述成樣本點內積的組合(這常常能經過算法的對偶形式實現)
  • 設法找到核函數Python.SVM(三)核方法,它能返回樣本點Python.SVM(三)核方法Python.SVM(三)核方法Python.SVM(三)核方法做用後的內積blog

  • Python.SVM(三)核方法替換Python.SVM(三)核方法、完成低維到高維的映射(同時也完成了從線性算法到非線性算法的轉換)

固然了,不難想象的是,並非全部的函數都可以對應一個映射(亦即不是全部的Python.SVM(三)核方法都能拆成Python.SVM(三)核方法好比說,顯然Python.SVM(三)核方法至少須要是一個對稱函數)。

幸運的是,1909 年提出的 Mercer 定理解決了這個問題,它的具體敘述會在文末給出。

Mercer 定理爲尋找核函數帶來了極大的便利。能夠證實以下兩族函數都是核函數:
Python.SVM(三)核方法
那麼核方法的應用場景有哪些呢?在 2002 年由 Scholkopf 和 Smola 證實的表示定理告訴咱們它的應用場景很是普遍。定理的具體內容一樣會附在文末。

2

核模型的表現

仍是用 GIF 來講明問題最爲形象。
當咱們對感知機應用核方法後,它就能對非線性數據集(好比螺旋線數據集)進行分類了,訓練過程將以下:
Python.SVM(三)核方法

3

怎麼應用核方法

簡單來講,就是把算法中涉及到樣本的地方都經過某種變換、弄成樣本的內積形式。以感知機爲例,感知機的原始損失函數爲:

Python.SVM(三)核方法
爲了讓損失函數中的樣本都變成內積形式,考慮令
Python.SVM(三)核方法
Python.SVM(三)核方法
(有沒有發現核形式和對偶形式很像?( σ'ω')σ)

4

如何訓練核模型

注意:爲簡潔,今後日後的推導和實現均以核感知機爲例,核 SVM 的相關討論會放在下一章介紹 SMO 算法時進行】

簡潔起見,咱們仍是用梯度降低法來進行訓練,爲此咱們須要進行求導工做。假設當前模型參數爲Python.SVM(三)核方法Python.SVM(三)核方法在參數Python.SVM(三)核方法下的預測值爲Python.SVM(三)核方法,則:

Python.SVM(三)核方法

爲了加速訓練,咱們須要將該算式向量化,爲此咱們須要定義核矩陣。假設如今咱們有兩組樣本Python.SVM(三)核方法Python.SVM(三)核方法,那麼它們的核矩陣即爲:

Python.SVM(三)核方法

對於訓練過程而言,咱們關心的是訓練樣本之間的核矩陣

Python.SVM(三)核方法

‍利用它,不難寫出相應的向量化代碼:

Python.SVM(三)核方法

對於預測過程,咱們關心的是原樣本和新樣本之間的核矩陣。假設新樣本爲

Python.SVM(三)核方法,則

Python.SVM(三)核方法
那麼預測過程即爲
Python.SVM(三)核方法

因而關鍵就在於如何定義計算核矩陣的核函數了。

對於多項式核來講,核函數的實現是直觀的:
Python.SVM(三)核方法

但對於 RBF 來講就沒那麼直觀了,用到了 Numpy 的高級實用技巧之一——升維:
Python.SVM(三)核方法

固然直接用 for 來實現也是能夠的,不過那將會很是很是慢……

5

核模型的實現

若是思路可以整理清楚,那麼核模型相比原模型來講只有以下兩點改變:

  • 須要定義核函數並計算出核矩陣
  • 計算預測值時不是Python.SVM(三)核方法,而是Python.SVM(三)核方法,其中
  • 在訓練時,K爲原樣本之間的核矩陣
  • 在測試時,K爲原樣本和新樣本的核矩陣

因此實現起來的話會有許多重複代碼,這裏就只展示其中最核心的部分(仍以核感知機爲例):
Python.SVM(三)核方法

6

相關數學理論

1)Cover 定理
Python.SVM(三)核方法

【注意:一般咱們會稱知足這兩個充要條件之一的函數爲 Mercer 核函數而把核函數定義得更寬泛。

不過若是不打算在理論上深刻太多的話,將 Mercer 核函數簡稱爲核函數是能夠的。

此外,雖然說 Mercer 核函數確實具備 Hilbert 空間中的內積形式、但此時的 Hilbert 空間並不必定具備「維度」這麼好的概念(或說、能夠認爲此時 Hilbert 空間的維度爲無窮大;好比說 RBF 核,它映射後的空間就是無窮維的)】

3)表示定理

Python.SVM(三)核方法
這意味着對於任意一個損失函數和一個單調遞增的正則化項組成的優化問題、咱們都可以對其應用核方法

下一篇文章咱們則會拋開梯度降低這個有些「偷懶」的作法,並介紹一種叫序列最小最優化(SMO)的算法

但願觀衆老爺們可以喜歡~
推薦閱讀:
精選乾貨|近半年乾貨目錄彙總----全是通俗易懂的硬貨!歡迎閱讀!
天然語言處理中CNN模型幾種常見的Max Pooling操做
乾貨|很是詳細的神經網絡入門解釋

歡迎關注公衆號學習交流~

Python.SVM(三)核方法
Python.SVM(三)核方法

相關文章
相關標籤/搜索