1 初始准备
import numpy as np
import matplotlib.pyplot as pl
from sklearn import svm,datasets
from pylab import mpl
mpl.rcParams['font.sans-serif']='SimHei' #画图正常显示中文
mpl.rcParams['axes.unicode_minus']=False #决绝保存图像是负号‘-’显示方块的问题
2绘图准备
由于sklearn包中有直接可以使用的方法,直接准备绘图(SVM里面的核函数编程太麻烦了,直接使用包)
def make_meshgrid(x,y,h=.02):
"""准备用于绘图的网格点
参数
————————
x:x轴数据点
y:y轴数据点
h:间隔距离
返回值
——————————
xx,yy:ndarray
"""
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
3 comtour图准备
def plot_contours(ax,clf,xx,yy,**params):
"""绘制分类器边界
参数
————————
ax:matplotlib.axes对象
xx:网格点
yy:网格点
params:控制绘图的其它字典
"""
Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])
Z=Z.reshape(xx.shape)
out=ax.contour(xx,yy,Z,**params)
return out
4 使用自带数据集进行建模
#载入鸢尾花数据集
iris=datasets.load_iris()
#为了后面方便绘图,这里只使用二个特征
X=iris.data[:,:2]
y=iris.target
C=1.0
#备用的各种模型设置
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=(u'SVC(线性核)',
u'LinearsSVC(线性核)',
u'SVC(RBF)',
u'SVC(3次多项式核)')
#把整个图划分成2*2网格
fig,sub=pl.subplots(2,2,figsize=(12,8))
pl.subplots_adjust(wspace=0.2,hspace=0.2)
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,alpha=0.8)
ax.scatter(X0,X1,c=y,cmap=pl.cm.coolwarm,s=20,edgecolors='k')
ax.set_xlim(xx.min(),xx.max())
ax.set_ylim(yy.min(),yy.max())
ax.set_xlabel(u'长')
ax.set_ylabel(u'宽')
ax.set_xticks(())#不显示坐标
ax.set_yticks(())#不显示坐标
ax.set_title(title)
pl.show()