Python中的支持向量机SVM的使用(附实例代码)


Posted in Python onJune 26, 2019

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

一、导入sklearn算法包

Scikit-Learn库已经实现了所有基本机器学习的算法,具体使用详见官方文档说明:http://scikit-learn.org/stable/auto_examples/index.html。

skleran中集成了许多算法,其导入包的方式如下所示,

逻辑回归:from sklearn.linear_model import LogisticRegression

朴素贝叶斯:from sklearn.naive_bayes import GaussianNB

K-近邻:from sklearn.neighbors import KNeighborsClassifier

决策树:from sklearn.tree import DecisionTreeClassifier

支持向量机:from sklearn import svm

二、sklearn中svc的使用

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

loadtxt()的使用方法:

Python中的支持向量机SVM的使用(附实例代码)

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

dtype:数据类型。eg:float、str等。

delimiter:分隔符。eg:‘,'。

converters:将数据列与转换函数进行映射的字典。eg:{1:fun},含义是将第2列对应转换函数进行转换。

usecols:选取数据的列。

以Iris兰花数据集为例子:

由于从UCI数据库中下载的Iris原始数据集的样子是这样的,前四列为特征列,第五列为类别列,分别有三种类别Iris-setosa, Iris-versicolor, Iris-virginica。

 

Python中的支持向量机SVM的使用(附实例代码)

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

因此我们要额外做一个工作,即通过loadtxt()函数中的converters参数将第五列通过转换函数映射成浮点类型的数据。

首先,我们要写出一个转换函数:

def iris_type(s):
  it = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}
  return it[s]

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

path = u'D:/f盘/python/学习/iris.data' # 数据文件路径
data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})

读入结果:

Python中的支持向量机SVM的使用(附实例代码)

(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分类器的准确率

print clf.score(x_train, y_train) # 精度
y_hat = clf.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print clf.score(x_test, y_test)
y_hat = clf.predict(x_test)
show_accuracy(y_hat, y_test, '测试集')

结果为:

Python中的支持向量机SVM的使用(附实例代码)

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

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

结果为:

Python中的支持向量机SVM的使用(附实例代码)Python中的支持向量机SVM的使用(附实例代码)

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轴范围1~3,y轴范围4~6,当绘制图像时主要分四步进行:

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

        [1 1 1]

[2 2 2]

[3 3 3]

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

[4 5 6]

[4 5 6]

[4 5 6]

【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]后的结果为:

Python中的支持向量机SVM的使用(附实例代码)

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

Python中的支持向量机SVM的使用(附实例代码)

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指图的边界。

最终结果为:

Python中的支持向量机SVM的使用(附实例代码)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单介绍Python中的filter和lambda函数的使用
Apr 07 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python文件读写保存操作的示例代码
Sep 14 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
Python流程控制 if else实现解析
Sep 02 Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
python开发的自动化运维工具ansible详解
Aug 07 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 Python
对python 中class与变量的使用方法详解
Jun 26 #Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 #Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 #Python
Python Numpy 实现交换两行和两列的方法
Jun 26 #Python
python 字典操作提取key,value的方法
Jun 26 #Python
通过PYTHON来实现图像分割详解
Jun 26 #Python
Flask模板引擎之Jinja2语法介绍
Jun 26 #Python
You might like
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
php实现aes加密类分享
2014/02/16 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
JS中操作JSON总结
2020/12/06 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
美国时尚在线:Showpo
2017/09/08 全球购物
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
水务局局长岗位职责
2013/11/28 职场文书
优秀班组长事迹
2014/05/31 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
python ansible自动化运维工具执行流程
2021/06/24 Python
python 中yaml文件用法大全
2021/07/04 Python
maven依赖的version声明控制方式
2022/01/18 Java/Android
Hive导入csv文件示例
2022/06/25 数据库