SVM核函數及sklearn實現SVM函數
在SVM中,其中最重要的也是最核心的就是核函數的選取和參數選擇,固然這個須要大量的經驗來支撐。今天咱們就是拋磚引玉形象的講解一下什麼是核函數,及在SVM中在哪用到。學習
咱們知道,SVM相對感知機而言,它能夠解決線性不可分的問題,那麼它是怎麼解決的呢?它的解決思想很簡單,就是對原始數據的維度變換,通常是擴維變換,使得原樣本空間中的樣本點線性不可分,可是在變維以後的空間中樣本點是線性可分的,而後再變換後的高維空間中進行分類。測試
瞭解SVM原理,而且有凸優化理論知識的話,都應該知道SVM其實主要是在用對偶理論求解一個二次凸優化問題,其中對偶問題以下:優化
求的最終結果:spa
其中表示任選的一個支持向量blog
固然這是線性可分的狀況,那麼若是問題自己是線性不可分的狀況呢,那就是先擴維後再計算,計算形式是同樣的:索引
其中表示原來的樣本擴維後的座標。utf-8
從中能夠看出,不論是不擴維的求解仍是擴維的求解,在求解對偶問題的過程當中都會用到各樣本點的內積的結果,那麼這時候問題來了,在不少狀況下,擴維可能會吧原數據擴到很高維(甚至無窮維),這時候直接求內積是很是困難的,咱們爲了不作這樣的事就提出了核函數的概念。it
核函數:任意兩個樣本點在擴維後的空間的內積,若是等於這兩個樣本點在原來空間通過一個函數後的輸出,那麼這個函數就叫核函數。io
固然這是我本身的理解定義,意思就是這麼個意思。也就是說:
這個函數f就是核函數。咱們接下來舉一個例子:
爲簡單起見,假設全部樣本點都是二維點,其值分別爲(x,y),,能夠驗證任意兩個擴維後的樣本點在3維空間的內積等於原樣本點在2維空間的函數輸出:
有了這個核函數,之後的高維內積均可以轉化爲低維的函數運算了,這裏也就是隻須要計算低維的內積,而後再平方。明顯問題獲得解決且複雜度下降極大。總而言之,核函數它本質上隱含了從低維到高維的映射,從而避免直接計算高維的內積。
固然上面所介紹的只是衆多核函數中的一個示例,它實際上是屬於多項式核函數這一類核函數中的一個特例。其實核函數還有不少種,相同種類可是不一樣參數的核函數效果又有所不一樣,須要說明的是並非說全部的核函數都能顯示的寫出隱含的從低維到高維的擴維細節。成爲核函數有知足的條件Mercer’s condition。通常用得比較多比較成熟的核函數有以下幾個。
核函數英文爲kernel function,所以通常這個函數符號通常用k不用 f。
★線性核函數:
★多項式核函數:
★徑像基核函數/高斯核函數:
★拉普拉斯核函數:
★sigmod核函數:
你們有時間能夠研究研究這些核函數分別應用在那些場景下。接下來給一個例子:
有如圖的這麼一些點,紅色圓點的是正類,藍色圓點的是負類。五星是預測樣本點,採用的核函數就是上面咱們舉例的核函數,細心的人會發現它就是
的多項式核函數,基於該多項式核函數能夠把左下角的預測樣本劃分爲正樣本,右上預測樣本爲負樣本。
# -*- coding:utf-8 -*-
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
X=np.array([[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[3,1],[4,1],[5,1],
[5,2],[6,1],[6,2],[6,3],[6,4],[3,3],[3,4],[3,5],[4,3],[4,4],[4,5]])
Y=np.array([1]*14+[-1]*6)
T=np.array([[0.5,0.5],[1.5,1.5],[3.5,3.5],[4,5.5]])
#X爲訓練樣本,Y爲訓練樣本標籤(1和-1),T爲測試樣本
svc=SVC(kernel='poly',degree=2,gamma=1,coef0=0)
svc.fit(X,Y)
pre=svc.predict(T)
print pre #輸出預測結果
print svc.n_support_ #輸出正類和負類支持向量總個數
print svc.support_ #輸出正類和負類支持向量索引
print svc.support_vectors_ #輸出正類和負類支持向量
結果輸出:
[ 1 1 -1 -1]
[2 3]
[14 17 3 5 13]
[[ 3. 3.]
[ 4. 3.]
[ 1. 4.]
[ 2. 2.]
[ 6. 4.]]
從結果總能夠看出,4個預測點分類爲前兩個爲1,後兩個爲-1.負類(藍色)支持向量有2個,在樣本集中索引爲14,17,分別爲(3,3)、(4,3)
正類(紅色)支持向量有3個,在樣本集中索引爲3,5,13,分別爲(1,4)、(2,2)、(6,4)
能夠想象出來,在3位空間的線性SVM,在原來的二維空間中是如圖黑線所示的相似於拋物線,這就是爲何SVM能夠分類線性不可分的問題。其實它在高維空間是可分的,見下圖
以上內容爲原創內容,本人也正在學習階段,若有不對,歡迎指正