网站首页 > 技术文章 正文
以下代码对比分析四种支持向量机分类预测的效果。使用到的支持向量机有:线性支持向量机、非线性支持向量机(线性核、高斯核、多项式核)
from sklearn.datasets import load_wine #读取sklearn库中的红酒数据集
from sklearn.svm import SVC,LinearSVC #导入支持向量机中要用的库
import matplotlib.pyplot as plt #导入绘图库
import numpy as np #导入计算库
#第一步:准备数据
data=load_wine() #读入红酒数据集的数据
X=data.data[:,:2] #取出数据的前两列特征
y=data.target #取出数据的标签值
x0,x1=X[:,0],X[:,1] #把前两列特征分别赋值给x0和x1
x_min,x_max=x0.min()-1,x0.max()+1 #第一列特征的最小值减1和最大值加1
y_min,y_max=x1.min()-1,x1.max()+1 #第二列特征的最小值减1和最大值加1
xx,yy=np.meshgrid(np.arange(x_min,x_max,0.05),np.arange(y_min,y_max,0.05))
#构建两个序列,分别以x_min和y_min为起始值,差值为0.05,终值为x_max和y_max(最大只能取到max-0.05)
第二步:构建分类模型
models=(LinearSVC(),SVC(kernel="linear"), SVC(kernel='rbf',gamma=0.7),SVC(kernel='poly',degree=4))
#定义使用的线性支持向量机、核为线性的支持向量机、核为高斯的支持向量机,核为多项式的支持向量机
models=(svm.fit(X,y) for svm in models) #使用红酒数据集来训练四个支持向量机
第三步:绘图准备
fig,ax=plt.subplots(2,2) #准备两行两列的画布,为绘制4个子图做准备
plt.subplots_adjust(wspace=0.4,hspace=0.4)#调整子图布局,wspace表示子图之间保留的宽度,hspace表示子图之间保留的高度
titles=('LinearSVC','SVC with linear kernel','SVC with RBF kernel','SVC with polynomial')
#定义四个支持向量机的名称,也就是绘制的4个子图名称
def plot_contours(ax,svm): #定义函数:绘制分类的边界
z=svm.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)
#计算四个支持向量机预测的标签值,并把结果按照xx的形状重构
return ax.contourf(xx,yy,z,cmap=plt.cm.viridis)
#返回绘制好的分类边界,contourf函数是绘制带填充的等高线
第四步:开始绘图
for model,title,ax in zip(models,titles,ax.flatten()):#循环读取四个模型、标题和子图
plot_contours(ax,model) #调用绘制分类边界函数
ax.scatter(x0,x1,c=y,cmap=plt.cm.magma,s=20,edgecolor='k')
#以x0和x1确定坐标点,绘制散点图
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_title(title) #设置每张子图的标题
plt.show()
例子使用的是sklearn自带的红酒数据集,共有178条数据,每条数据13个分类。取数据集的前两列,绘制散点图和分类边界。四个支持向量机都使用了默认的正则化系数,C=1,参数kernel指定的是非线性支持向量机使用的核,高斯核中的参数gamma表示核宽度,也就是径向作用范围。增大gamma值效果如下,过于拟合当前数据,模型复杂度高,泛化能力差。
多项式支持向量机中参数degree表示多项式的最高次幂。zip函数将对象中对应的元素打包成一个个元组,然后返回这些元组组成的列表。这里就是把模型、标题、子图序号分别打包成三个元组,model循环读取模型列表,title循环读取标题列表,ax.flatten()是把ax一维化,然后逐一取出每一个要绘制的子图。
猜你喜欢
- 2024-10-14 Python之Matplotlib数据可视化一:简易线形图
- 2024-10-14 圆:circle-sin-cos动画的matplotlib
- 2024-10-14 python 100天 68 利用Python绘制两个波形正弦sin函数相关性
- 2024-10-14 画直线不简单!python-matplotlib告诉你为什么
- 2024-10-14 用Python下一场流星雨,女生看了都哭了
- 2024-10-14 手把手教你使用Numpy、Matplotlib、Scipy等5个Python库
- 2024-10-14 走进Matplotlib世界(一)(matplotlib.org)
- 2024-10-14 Python 数据分析——matplotlib 坐标变换和注释
- 2024-10-14 利用axe对象绘制地图局部缩放图(下面几种建模对象能通过基本实体工具直接绘制的是)
- 2024-10-14 Python动态绘图的方法(上)(canvas python动态绘图)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)