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应用程序在windows下不出现cmd窗口的办法
May 29 Python
简单介绍Python中的readline()方法的使用
May 24 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
用python爬取租房网站信息的代码
Dec 14 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
python调用摄像头拍摄数据集
Jun 01 Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 Python
python利用tkinter实现屏保
Jul 30 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
python利用opencv保存、播放视频
Nov 02 Python
七个Python必备的GUI库
Apr 27 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
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
div层的移动及性能优化
2010/11/16 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
微信小程序整个页面的自动适应布局的实现
2020/07/12 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
python爬取网站数据保存使用的方法
2013/11/20 Python
Windows下为Python安装Matplotlib模块
2015/11/06 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
Python箱型图处理离群点的例子
2019/12/09 Python
Python模块future用法原理详解
2020/01/20 Python
零基础小白多久能学会python
2020/06/22 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
公司综合部的成员自我评价分享
2013/11/05 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
毕业证明书
2015/06/19 职场文书
英文投诉信格式
2015/07/03 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers