SVM向量机是可以把数据从低维投向高维的方法,常用的内核有线性内核linearSVM和非线性内核多项式内核(Polynomial kernel)和径向内核(Radial basis function kernel,RBF)
这里我们用数据库带有的红酒数据做例子,我们用相同的数据用四个不同的核函数画出数据的图形来看下他们的区别。
#导入红酒数据库
from sklearn.datasets import load_wine
#定义函数来绘制画图
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)
#使用酒的数据
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','linearSVC (linear kernel)','SVC with RBF kernel','SVC with polymomial(degree 3)kernel')
#设定一个子图形的个数和排列方式进行画图
fig,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('Feature 1')
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(title)
#将图形显示出来
plt.show()