python中svm的使用,svm支持向量机算法

  python中svm的使用,svm支持向量机算法

  支持向量机除了在Matlab中使用PRTools工具箱中的svm算法外,在Python中还可以用于分类。因为Python中的sklearn库也集成了SVM算法,所以本文的运行环境是Pycharm。

  一、导入sklearn算法包

  SCI-KIT-LEARN库实现了基本机器学习的所有算法。详情可参考官方文档:http://SCI-KIT-LEARN.org/stable/auto _ examples/index . html #支持向量机(support-vector-machines)。

  Skleran集成了很多算法,其导入包的方式如下:

  逻辑回归:从sklearn.linear _ model导入逻辑回归

  朴素贝叶斯:来自sklearn.naive _ Bayes导入高斯NB

  来自sklearn的:邻居。邻居进口邻居分类器

  决策树:从sklearn.tree导入决策树分类器

  支持向量机:从sklearn导入svm

  二、sklearn中svc的使用

  (1)使用numpy中的loadtxt读取数据文件。

  如何使用load():

  fname :文件路径。例如:C:/Dataset/iris.txt .

  类型:数据类型。例如:浮点、字符串等。

  分隔符:分隔符。例如:, .

  转换器:将数据列映射到转换函数的字典。

  : { 1: fun },意思是转换第二列中对应的转换函数。

  使用列:选择数据列。

  以蝴蝶兰数据集为例:

  由于从UCI数据库下载的原始鸢尾数据集看起来是这样的,前四列是特征列,第五列是类别列,包括三个类别:鸢尾-刚毛鸢尾、鸢尾-杂色鸢尾和鸢尾-海滨鸢尾。

  在使用numpy中的loadtxt函数导入这个数据集时,假设数据类型dtype为浮点型,但是很明显第五列的数据类型不是浮点型。

  所以我们要多做一项工作,就是通过loadtxt()函数中的converters参数,由转换函数将第五列映射成浮点数据。

  首先,我们必须写一个转换函数:

  defiris _类型:

  它={ 鸢尾-刚毛鸢尾 :0,鸢尾-杂色鸢尾 :1,鸢尾-海滨鸢尾 :2}

  Returnit[s]接下来,读入数据。converters={4: iris_type}中的“4”是指第5列:

  Path=uD:/f disk /pyt

  hon/学习/iris.data'#数据文件路径

  data=np.loadtxt(path,dtype=float,delimiter=',',converters={4:iris_type})读入结果:

  

  (2)将Iris分为训练集与测试集

  

x,y=np.split(data,(4,),axis=1)

  x=x[:,:2]

  x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=1,train_size=0.6)

1.split(数据,分割位置,轴=1(水平分割) or 0(垂直分割))。

  2.x = x[:, :2]是为方便后期画图更直观,故只取了前两列特征值向量训练。

  3.sklearn.model_selection.train_test_split随机划分训练集与测试集。train_test_split(train_data,train_target,test_size=数字, random_state=0)

  参数解释:

  ·train_data:所要划分的样本特征集

  ·train_target:所要划分的样本结果

  ·test_size:样本占比,如果是整数的话就是样本的数量

  ·random_state:是随机数的种子。

  随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

  (3)训练svm分类器

  

#clf=svm.SVC(C=0.1,kernel='linear',decision_function_shape='ovr')

  clf=svm.SVC(C=0.8,kernel='rbf',gamma=20,decision_function_shape='ovr')

  clf.fit(x_train,y_train.ravel())

kernel='linear'时,为线性核,C越大分类效果越好,但有可能会过拟合(defaul C=1)。

  kernel='rbf'时(default),为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。

  decision_function_shape='ovr'时,为one v rest,即一个类别与其他类别进行划分,

  decision_function_shape='ovo'时,为one v one,即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。

  (4)计算svc分类器的准确率

  

printclf.score(x_train,y_train)#精度

  y_hat=clf.predict(x_train)

  show_accuracy(y_hat,y_train,'训练集')

  printclf.score(x_test,y_test)

  y_hat=clf.predict(x_test)

  show_accuracy(y_hat,y_test,'测试集')

结果为:

  

  如果想查看决策函数,可以通过decision_function()实现

  

print'decision_function:\n',clf.decision_function(x_train)

  print'\npredict:\n',clf.predict(x_train)

结果为:

  

  

  decision_function中每一列的值代表距离各类别的距离。

  (5)绘制图像

  1.确定坐标轴范围,x,y轴分别表示两个特征

  

x1_min,x1_max=x[:,0].min(),x[:,0].max()#第0列的范围

  x2_min,x2_max=x[:,1].min(),x[:,1].max()#第1列的范围

  x1,x2=np.mgrid[x1_min:x1_max:200j,x2_min:x2_max:200j]#生成网格采样点

  grid_test=np.stack((x1.flat,x2.flat),axis=1)#测试点

  #print'grid_test=\n',

  grid_testgrid_hat=clf.predict(grid_test)#预测分类值

  grid_hat=grid_hat.reshape(x1.shape)#使之与输入的形状相同

这里用到了mgrid()函数,该函数的作用这里简单介绍一下:

  假设假设目标函数F(x,y)=x+y。x轴范围13,y轴范围46,当绘制图像时主要分四步进行:

  【step1:x扩展】(朝右扩展):

  

[111]

  [222]

  [333]

【step2:y扩展】(朝下扩展):

  

[456]

  [456]

  [456]

【step3:定位(xi,yi)】:

  

[(1,4)(1,5)(1,6)]

  [(2,4)(2,5)(2,6)]

  [(3,4)(3,5)(3,6)]

【step4:将(xi,yi)代入F(x,y)=x+y】

  因此这里x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]后的结果为:

  

  再通过stack()函数,axis=1,生成测试点

  

  2.指定默认字体

  

mpl.rcParams['font.sans-serif']=[u'SimHei']

  mpl.rcParams['axes.unicode_minus']=False

3.绘制

  

cm_light=mpl.colors.ListedColormap(['#A0FFA0','#FFA0A0','#A0A0FF'])

  cm_dark=mpl.colors.ListedColormap(['g','r','b'])

  plt.pcolormesh(x1,x2,grid_hat,cmap=cm_light)

  plt.scatter(x[:,0],x[:,1],c=y,edgecolors='k',s=50,cmap=cm_dark)#样本

  plt.scatter(x_test[:,0],x_test[:,1],s=120,facecolors='none',zorder=10)#圈中测试集样本

  plt.xlabel(u'花萼长度',fontsize=13)

  plt.ylabel(u'花萼宽度',fontsize=13)

  plt.xlim(x1_min,x1_max)

  plt.ylim(x2_min,x2_max)

  plt.title(u'鸢尾花SVM二特征分类',fontsize=15)

  #plt.grid()

  plt.show()

pcolormesh(x,y,z,cmap)这里参数代入x1,x2,grid_hat,cmap=cm_light绘制的是背景。

  scatter中edgecolors是指描绘点的边缘色彩,s指描绘点的大小,cmap指点的颜色。

  xlim指图的边界。

  最终结果为:

  盛行IT软件开发工作室,大量的免费python视频教程,欢迎在线学习!

  本文转自:https://www.jianshu.com/p/7367245ea990

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: