將二維數據變成三維數據的過程,稱為將數據投射到高維空間.,這正是SVM算法的核函數(kernel trick)功能.
在SVM中用的最普遍的兩種把數據投射到高維空間的方法分別是多項式內核(Polynomial kernel)和徑向基內核(Radial basis function kernel,RBF).
1.SVM支持向量機的核函數
在SVM算法中,訓練模型的過程實際上是對每個數據點對於數據分裂決定邊界的重要性進行判斷.在訓練數據集中,只有一部分數據對於邊界的確定是有幫助的,而這些數據點就是正好位於決定邊界上的,這些數據被稱為"支持向量"(support vectors).
(1)核函數為linear的SVM支持向量機
############################# 支持向量機的核函數 ####################################### #導入numpy import numpy as np #導入畫圖工具 import matplotlib.pyplot as plt #導入支持向量機svm from sklearn import svm #導入數據集生成工具 from sklearn.datasets import make_blobs #先創建50個數據點,讓他們分為兩類 X,y = make_blobs(n_samples=50,centers=2,random_state=6) #創建一個線性內核的支持向量機模型 clf = svm.SVC(kernel = 'linear',C=1000) clf.fit(X,y) #把數據點畫出來 plt.scatter(X[:, 0],X[:, 1],c=y,s=30,cmap=plt.cm.Paired) #建立圖像坐標 ax = plt.gca() xlim = ax.get_xlim() ylim = ax.get_ylim() #生成兩個等差數列 xx = np.linspace(xlim[0],xlim[1],30) yy = np.linspace(ylim[0],ylim[1],30) YY,XX = np.meshgrid(yy,xx) xy = np.vstack([XX.ravel(),YY.ravel()]).T Z = clf.decision_function(xy).reshape(XX.shape) #把分類的決定邊界畫出來 ax.contour(XX,YY,Z,colors='k',levels=[-1,0,1],alpha=0.5,linestyles=['--','-','--']) ax.scatter(clf.support_vectors_[:, 0],clf.support_vectors_[:, 1],s=100,linewidth=1,facecolors='none') plt.show()
(2)把SVM的內核換成是RBF
#創建一個RBF內核的支持向量機模型 clf_rbf = svm.SVC(kernel='rbf',C=1000) clf_rbf.fit(X,y) #把數據點畫出來 plt.scatter(X[:, 0],X[:, 1],c=y,s=30,cmap=plt.cm.Paired) #建立圖像坐標 ax = plt.gca() xlim = ax.get_xlim() ylim = ax.get_ylim() #生成兩個等差數列 xx = np.linspace(xlim[0],xlim[1],30) yy = np.linspace(ylim[0],ylim[1],30) YY,XX = np.meshgrid(yy,xx) xy = np.vstack([XX.ravel(),YY.ravel()]).T Z = clf_rbf.decision_function(xy).reshape(XX.shape) #把分類的決定邊界畫出來 ax.contour(XX,YY,Z,colors='k',levels=[-1,0,1],alpha=0.5,linestyles=['--','-','--']) ax.scatter(clf.support_vectors_[:, 0],clf.support_vectors_[:, 1],s=100,linewidth=1,facecolors='none') plt.show()
2.SVM的核函數與參數選擇
#導入紅酒數據集 from sklearn.datasets import load_wine #導入支持向量機svm from sklearn import svm #定義一個函數用來畫圖 def make_meshgrid(x,y,h=.02): x_min,x_max = x.min() - 1,x.max() + 1 y_min,y_max = y.min() - 1,y.max() + 1 xx,yy = np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h)) return xx,yy #定義一個繪制等高線的函數 def plot_contours(ax,clf,xx,yy,**params): Z = clf.predict(np.c_[xx.ravel(),yy.ravel()]) Z = Z.reshape(xx.shape) out = ax.contourf(xx,yy,Z,**params) return out #使用酒的數據集 wine = load_wine() #選取數據集的前兩個特征 X = wine.data[:, :2] y = wine.target C = 1.0 #svm的正則化參數 models = (svm.SVC(kernel='linear',C=C),svm.LinearSVC(C=C),svm.SVC(kernel='rbf',gamma=0.7,C=C),svm.SVC(kernel='poly',degree=3,C=C)) models = (clf.fit(X,y) for clf in models) #設定圖題 titles = ('SVC with linear kernel','LineatSVC (linear kernel)','SVC with RBF kernel','SVC with polynomial (degree 3) kernel') #設定一個子圖形的個數和排列方式 flg, sub = plt.subplots(2, 2) plt.subplots_adjust(wspace=0.4,hspace=0.4) #使用前面定義的函數進行畫圖 X0,X1, = X[:, 0],X[:, 1] xx,yy = make_meshgrid(X0,X1) for clf,title,ax in zip(models,titles,sub.flatten()): plot_contours(ax,clf,xx,yy,cmap=plt.cm.plasma,alpha=0.8) ax.scatter(X0,X1,c=y,cmap=plt.cm.plasma,s=20,edgecolors='k') ax.set_xlim(xx.min(),xx.max()) ax.set_ylim(yy.min(),yy.max()) ax.set_xlabel('Feature 0') ax.set_ylabel('Featuer 1') ax.set_xticks(()) ax.set_yticks(()) ax.set_title(title) #將圖型顯示出來 plt.show()
3.SVM支持向量機的gamma參數調節
C = 1.0 #svm的正則化參數 models = (svm.SVC(kernel='rbf',gamma=0.1,C=C),svm.SVC(kernel='rbf',gamma=1,C=C),svm.SVC(kernel='rbf',gamma=10,C=C)) models = (clf.fit(X,y) for clf in models) #設定圖題 titles = ('gamma = 0.1','gamma = 1','gamma = 10',) #設定一個子圖形的個數和排列方式 flg, sub = plt.subplots(1,3,figsize = (10,3)) #使用定義好的函數進行畫圖 X0,X1, = X[:, 0],X[:, 1] xx,yy = make_meshgrid(X0,X1) for clf,title,ax in zip(models,titles,sub.flatten()): plot_contours(ax,clf,xx,yy,cmap=plt.cm.plasma,alpha=0.8) ax.scatter(X0,X1,c=y,cmap=plt.cm.plasma,s=20,edgecolors='k') ax.set_xlim(xx.min(),xx.max()) ax.set_ylim(yy.min(),yy.max()) ax.set_xlabel('Feature 0') ax.set_ylabel('Featuer 1') ax.set_xticks(()) ax.set_yticks(()) ax.set_title(title) #將圖型顯示出來 plt.show()
總結:
SVM支持向量機的優勢與不足:
如果數據集中的樣本數量在1萬以內,SVM都能駕馭的了,但如果樣本數量超過10萬的話,SVM就會非常的耗費時間和內存.
SVM還有一個短板,就是對數據預處理和參數調節要求非常高.
SVM支持向量機算法中,有3個參數是比較重要的:
- 第一個是核函數的選擇
- 第二個是核函數的參數
- 第三個是正則化參數C
文章引自 : 《深入淺出python機器學習》