從核函數到SVM原理--sklearn-SVM實現


SVM核函數及sklearn實現SVM

SVM中,其中最重要的也是最核心的就是核函數的選取和參數選擇,當然這個需要大量的經驗來支撐。今天我們就是拋磚引玉形象的講解一下什么是核函數,及在SVM中在哪用到。

我們知道,SVM相對感知機而言,它可以解決線性不可分的問題,那么它是怎么解決的呢?它的解決思想很簡單,就是對原始數據的維度變換,一般是擴維變換,使得原樣本空間中的樣本點線性不可分,但是在變維之后的空間中樣本點是線性可分的,然后再變換后的高維空間中進行分類。

了解SVM原理,並且有凸優化理論知識的話,都應該知道SVM其實主要是在用對偶理論求解一個二次凸優化問題,其中對偶問題如下:

 

 

求的最終結果:

 

 其中表示任選的一個支持向量

當然這是線性可分的情況,那么如果問題本身是線性不可分的情況呢,那就是先擴維后再計算,計算形式是一樣的:

其中表示原來的樣本擴維后的坐標。

 從中可以看出,不管是不擴維的求解還是擴維的求解,在求解對偶問題的過程中都會用到各樣本點的內積的結果,那么這時候問題來了,在很多情況下,擴維可能會吧原數據擴到很高維(甚至無窮維),這時候直接求內積是非常困難的,我們為了避免做這樣的事就提出了核函數的概念。

 

核函數:任意兩個樣本點在擴維后的空間的內積,如果等於這兩個樣本點在原來空間經過一個函數后的輸出,那么這個函數就叫核函數。

 

當然這是我自己的理解定義,意思就是這么個意思。也就是說:

這個函數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,513,分別為(1,4)(2,2)(6,4)

 

 可以想象出來,在3位空間的線性SVM,在原來的二維空間中是如圖黑線所示的類似於拋物線,這就是為什么SVM可以分類線性不可分的問題。其實它在高維空間是可分的,見下圖

 

 

 

 以上內容為原創內容,本人也正在學習階段,如有不對,歡迎指正

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM