支援向量機分類演算法

支援向量機SVM

支援向量機原理

  1.尋求最有分類邊界

    正確:對大部分樣本可以正確的劃分類別

    泛化:最大化支援向量間距

    公平:與支援向量等距

    簡單:線性、直線或平面,分割超平面

  2.基於核函數的生維變換

    通過名為核函數的特徵變換,增加新的特徵,使得低維度的線性不可分問題變為高維度空間中線性可分問題。

一、引論

  使用SVM支援向量機一般用於分類,得到低錯誤率的結果。SVM能夠對訓練集意外的數據點做出很好的分類決策。那麼首先我們應該從數據層面上去看SVM到底是如何做決策的,這裡來看這樣一串數據集集合在二維平面坐標繫上描繪的圖:

 

  現在我們需要考慮,是否能夠畫出一條直線將圓形點和星星點分開。像first第一張圖片來看,圓點和星點就分的很開,很容易就可以在圖中畫出一條直線將兩組數據分開。而看第二張圖片,圓點和星點幾乎都聚合在一起,要區分的話十分困難。

  我們要劃線將他們區分開來的話,有有無數條可以畫,但是我們難以找到一條最好區分度最高的線條將它們幾乎完全區分。那麼在此我們需要了解兩個關於數據集的基本概念:

 

二、理論鋪墊

線性可分性(linear separability)

  而對機器學習來說,涉及的多是高維空間(多維度)的數據分類,高維空間的SVM,即為超平面。機器學習的最終目的就是要找到最合適的(也即最優的)一個分類超平面(Hyper plane),從而應用這個最優分類超平面將特徵數據很好地區分為兩類。

決策邊界

  SVM是一種優化的分類演算法,其動機是尋找一個最佳的決策邊界,使得從決策邊界與各組數據之間存在margin,並且需要使各側的margin最大化。那麼這個決策邊界就是不同類之間的界限。

  總而言之:在具有兩個類的統計分類問題中,決策邊界或決策表面是超平面,其將基礎向量空間劃分為兩個集合,一個集合。 分類器將決策邊界一側的所有點分類為屬於一個類,而將另一側的所有點分類為屬於另一個類。

 

支援向量(support vector

  在了解了超平面和決策邊界我們發現SVM的核心任務是找到一個超平面作為決策邊界。那麼滿足該條件的決策邊界實際上構造了2個平行的超平面作為間隔邊界以判別樣本的分類:

  

 

 

 

核方法

  

  以迴避內積的顯式計算。

 

常見的核函數:

kernel : {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf'

 

  當多項式核的階為1時,其被稱為線性核,對應的非線性分類器退化為線性分類器。RBF核也被稱為高斯核(Gaussian kernel),其對應的映射函數將樣本空間映射至無限維空間。

 

SMO序列最小優化演算法

                                                                              

 

 

 

三、Python sklearn程式碼實現:

sklearn.svm.SVC語法格式為:

class sklearn.svm.SVC(  *, 
                        C=1.0, 
                        kernel='rbf',
                        degree=3, 
                        gamma='scale', 
                        coef0=0.0, 
                        shrinking=True, 
                        probability=False, 
                        tol=0.001, 
                        cache_size=200, 
                        class_weight=None, 
                        verbose=False, 
                        max_iter=- 1, 
                        decision_function_shape='ovr', 
                        break_ties=False, 
                        random_state=None)

基於鳶尾花數據的實現及解釋

程式碼如下:

 1 # 導入模組
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4 from sklearn import svm, datasets
 5 from sklearn.model_selection import train_test_split
 6 
 7 # 鳶尾花數據
 8 iris = datasets.load_iris()         #原始數據
 9 feature = iris.data[:, :2] # 為便於繪圖僅選擇2個特徵(根據前兩列數據和結果進行分類)
10 target = iris.target
11 
12 #數組分組訓練數據和測試數據
13 x_train,x_test,y_train,y_test=train_test_split(feature,target,test_size=0.2,random_state=2020)
14 
15 # 測試樣本(繪製分類區域),我們數據選了兩列即就是兩個特徵,所以這裡有xlist1,xlist2
16 xlist1 = np.linspace(x_train[:, 0].min(), x_train[:, 0].max(), 200)
17 xlist2 = np.linspace(x_train[:, 1].min(), x_train[:, 1].max(), 200)
18 XGrid1, XGrid2 = np.meshgrid(xlist1, xlist2)
19 # 實例化一個svm模型,非線性SVM:RBF核,超參數為0.5,正則化係數為1,SMO迭代精度1e-5, 記憶體佔用1000MB
20 svc = svm.SVC(kernel='rbf', C=1, gamma=0.5, tol=1e-5, cache_size=1000)
21 drill=svc.fit(x_train,y_train)
22 
23 #得到測試分數和測試分類
24 print(drill.score(x_test,y_test))      #測試分數
25 print(drill.predict(x_test[3].reshape(1,-1)))   #預測測試數據第三組樣本的分類或預測結果
26 
27 # 預測並繪製結果(以下都為繪圖)
28 Z = drill.predict(np.vstack([XGrid1.ravel(), XGrid2.ravel()]).T)
29 Z = Z.reshape(XGrid1.shape)
30 plt.contourf(XGrid1, XGrid2, Z, cmap=plt.cm.hsv)
31 plt.contour(XGrid1, XGrid2, Z, colors=('k',))
32 plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, edgecolors='k', linewidth=1.5, cmap=plt.cm.hsv)
33 plt.show()