支援向量機分類演算法
支援向量機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()