优秀的编程知识分享平台

网站首页 > 技术文章 正文

浅谈支持向量机(2)

nanyue 2024-11-24 19:42:18 技术文章 1 ℃

本节我们使用支持向量机分析预测一个测试数据集,形成可视化效果。代码如下和运行效果如下,具体解释每句代码的含义。

import numpy as np #导入numpy库

import matplotlib.pyplot as plt #导入绘图库

from sklearn.svm import SVC #导入支持向量机

from sklearn.datasets import make_blobs #导入数据集

#创建数据集

X,y=make_blobs(n_samples=80,centers=2,random_state=77) #创建由80个数据点组成的二分类数据集

svc=SVC(kernel='linear',C=100) #创建一个线性支持向量机,C为正则化系数,表示对误差的容忍度,越大则对模型要求越严格,越不能容忍误差,反之相反

plt.scatter(X[:,0],X[:,1],c=y,s=60,cmap=plt.cm.PRGn_r,edgecolors='w') #绘制所有特征点,特征点坐标由X[:,0]和X[:,1]共同组成

ax=plt.gca() #获取该坐标系

xlim=ax.get_xlim() #把数据集中X[:,0]的最小值和最大值赋值给变量xlim,xlim[1]为最大值 xlim[0]为最小值,ax.get_xlim()是返回图像横轴的最小值和最大值

ylim=ax.get_ylim() #把数据集中X[:,1]的最小值和最大值赋值给变量ylim,ylim[1]为最大值 ylim[0]为最小值,,ax.get_ylim()是返回图像纵轴的最小值和最大值

xx=np.linspace(xlim[0],xlim[1],20) #生成由20个数值组成的等差数列xx,点与点之间差值为(xlim[1]-xlim[0])/19

yy=np.linspace(ylim[0],ylim[1],20) #生成由20个数值组成的等差数列yy,点与点之间差值为(ylim[1]-ylim[0])/19

YY,XX=np.meshgrid(yy,xx) #画出用yy和xx的值构成的网格

xy=np.vstack([XX.ravel(),YY.ravel()]).T #ravel函数是把多维数组拉成一维数组,vstack是垂直堆叠两个数组,.T是转置原矩阵

svc.fit(X,y) #使用之前数据集创建的数据点,训练支持向量机

Z=svc.decision_function(xy).reshape(XX.shape) #decision_function通过度量样本距离分隔线的距离来表示置信度,这里用来确定分隔线和两条经过支持向量线的位置

ax.contour(XX,YY,Z,levels=[-1,0,1],alpha=0.6,linestyles=["--",'-','--']) #contour函数用来绘制等高线,这里绘制分隔线和两条经过支持向量的线

ax.scatter(svc.support_vectors_[:,0],svc.support_vectors_[:,1],s=100,linewidth=5,facecolors='red') #绘制支持向量点,用红色表示

plt.show() #显示绘制的图像

前面构造的数据集,X的形状是(80,2)即80行2列,表示特征值,y为(80,)即一行80个数据,表示标签值。正则化系数C越小代表当前构建的模型对误差的容忍度越强,对模型要求越低,我们来极端一点取C的值为0.001。

可以看到间隔更宽,支持向量点更多地落在间隔里。YY,XX=np.meshgrid(yy,xx)具体解释给个例子,如果x=[1,2],y=[4,5,6],y和x共同构建网格就是[[4,1],[5,1],[6,1]

[4,2],[5,2],[6,2]],然后我们分别取出YY=[[4,5,6] , XX=[[1,1,1],这时生成的YY和XX就是两个大小相等矩阵。YY每行都是其

[4,5,6]] [2,2,2]]

自身的副本,XX每列都是其自身的副本。YY和XX在以上程序中均为20*20的矩阵,xy=np.vstack([XX.ravel(),YY.ravel()]).T,首先把XX和YY展成一维也就是一行400个值,然后vstack

把两者垂直堆叠起来变成2*400的矩阵,接着.T进行转置变成400*2的矩阵。这样我们就构造出一个和原数据集取值范围相同的新的数据集。Z=svc.decision_function(xy).reshape(XX.shape),接着使用支持向量机预测新数据集的所有点,得到每个点属于正样本的可信度,也就是距离分隔线的距离。使用ax.contour(XX,YY,Z,levels=[-1,0,1],alpha=0.6,linestyles=["--",'-','--'])绘制三条线,分别是距离为-1的经过绿色支持向量点的直线,距离为0分隔线,以及距离为1的经过紫色支持向量点的直线,三者平行。

最近发表
标签列表