支持向量机python代码_Python中的支持向量机SVM的使用(有实例)

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

一、导入sklearn算法包

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()的使用方法:

541276-20170426170343131-1625363622.png

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。

541276-20170426181745615-1007053664.png

当使用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})

读入结果:

541276-20170426184029053-362911109.png

(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, '测试集')

结果为:

541276-20170427160949194-165722037.png

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

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

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

结果为:

541276-20170427161310319-1879566644.png

541276-20170427161328490-1032156318.png

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_test

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

541276-20170427165215147-1604916463.png

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

541276-20170427165432975-354852760.png

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

最终结果为:

541276-20170427173220537-1741632876.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 23将引入标准库模块支持,编译速度提升10倍

点击蓝字关注我们虽然模块是 C 20 的主要卖点,但与 C 20 不同的是,C 23 的标准库也将实现模块化。从标准库开始,模块有望改善编译速度和 C 开发者组织代码的方式。C 是丹麦计算机科学家 Bjarne Stroustrup 创建的编程语言,由 ISO …

python刷题_11.学习Python,刷题才能让你感受到快(差)乐(距)!

猜数字游戏可用一个简单的while循环来实现。 其中 随机数 的生成在第4篇介绍过, 键盘输入在上一篇介绍过 import random result round(random.random()*100) while result ! guess: guess int(input()) if guess>result: print(大了!) elif guess print(小了!)…

java jigsaw_Java 9和Project Jigsaw如何破坏您的代码

java jigsawJava 9迫在眉睫,它将带有完整的Project Jigsaw 。 在我从OpenJFX邮件列表的最近讨论中得知它可能会破坏现有代码之前,我并没有对此给予太多关注。 这对于Java非常不寻常,因此引起了我的兴趣。 我阅读了该项目的JEP和一些相关文章…

C语言的万能“三板斧”

点击蓝字关注我们作为嵌入式工程师,写一个效率高效,思路清晰的C语言程序是我们的终极目标。那么,怎样才能写好这样的程序呢?首先,我们要用C语言的思维方式来进行程序的构架构建;其次,要有良好的…

aws sqs_在Spring中将AWS SQS用作JMS提供程序

aws sqs最近AWS公布了新的客户端库,它实现了JMS 1.1规范 ,并使用他们的简单队列服务 (SQS)作为JMS提供者 (见杰夫巴尔的帖子在这里 )。 在我的文章中,我将向您展示如何设置Maven项目以使用Sprin…

openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断

编者注:单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢?常见的方法主要有以下两种:1.在接收数据时启动一个定时器,在指定时间间隔内没有接收到新数据,认为数…

java 多线程性能_Java中多线程的性能比较

java 多线程性能Java中有多种用于多线程的技术。 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码。 这篇文章将比较使用synced关键字ReentrantLock,getAndIncrement()以及执行get()和compareAnd…

C语言贪吃蛇小游戏 | 源码

点击蓝字关注我们该程序已经在VS2019上验证过了&#xff0c;可以直接运行。程序目录程序里就只有一个test.cpp文件&#xff0c;也就是说大家可以先创建工程&#xff0c;然后直运行效果C语言学习资源汇总【最新版】源码#include<stdio.h> #include<stdlib.h> #inclu…

东华大学计算机学院讲座单,计信学院成功举办2018级专业导师面对面系列讲座活动...

为帮助大一新生尽快适应大学生活&#xff0c;了解专业&#xff0c;掌握知识&#xff0c;计信学院积极响应学校号召&#xff0c;成立由教授、博士组成的专业导师团队&#xff0c;为各专业开展系列专业知识讲座。自10月17日晚7点至10月26日下午4点&#xff0c;各专业导师面对面系…

C函数指针别再停留在语法,得上升到软件设计

点击蓝字关注我们经常有朋友问到底如何在C程序中采用面向对象编程?如何让模块之间松耦合&#xff1f;......其实究其原因还是没有把C语言与软件设计很好的联系起来。这里跟大家找了一些内容&#xff0c;相信认真看完全文多多少少会有你想要的答案&#xff1a;正文部分&#xf…

spring默认缓存管理器_使用Spring的缓存管理器缓存Web内容

spring默认缓存管理器在这篇文章中&#xff0c;我想向大家展示如何使用Spring的CacheManager&#xff0c; Cacheable和JMX批注来缓存和管理Web内容的缓存的基础知识。 想象一下一个网上商店&#xff0c;它从远程WCMS&#xff08;Web内容管理系统&#xff09;获取一些内容&#…

计算机软件选修课选什么好,大学值得选的“选修课”,一点不比专业课差,能选上最好认真听...

原标题&#xff1a;大学值得选的“选修课”&#xff0c;一点不比专业课差&#xff0c;能选上最好认真听文/小哈你是怎样对待你的选修课的&#xff1f;以前经常听学长学姐们说过这样一句话&#xff0c;“上大学之后&#xff0c;专业课选逃&#xff0c;选修课必逃”。不知道大家是…

C/C++程序员的编程修养

点击蓝字关注我们什么是好的C/C程序员&#xff1f;是不是懂得很多技术细节&#xff1f;还是懂底层编程&#xff1f;还是编程速度比较快&#xff1f;我觉得都不是。对于一些技术细节来说和底层的技术&#xff0c;只要看帮助&#xff0c;查资料就能找到&#xff0c;对于速度快&am…

python账号密码一一对应_python模拟用户登录系统,如何两个用户输入各自的密码才能登入?...

展开全部 #我可以把我自己2113的成果送你&#xff0c;你来研究5261研究 import json #用来存储数据4102的模块 import os #用来进行文件操作1653 import sys #获取脚本所在目录用 import re #用来进行字符串操作 script_path os.path.realpath(__file__) PATH os.path.dirnam…

C语言#define与typedef的区别

点击蓝字关注我们在C语言编程中&#xff0c;typedef 和 #define是最常用语句&#xff0c;可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typedef的用法在C/C语言中&#xff0c;typedef常用来定义一个标识符及关键字的别名&#xff0c;它是语言编译过程的一部…

html文字添加波浪线,利用css渐变给文字下方加波浪线

具体代码如下.wavy-line-decoration {position: relative;line-height: 1.5em;}.wavy-line-decoration::before {content: ;position: absolute;bottom: -3px;width: 100%;height: 0.25em;background: // 可以给同一个元素同时添加多个背景渐变图层&#xff0c;用逗号隔开&…

新旧C++生成随机浮点数方法,你喜欢哪个?

点击蓝字关注我们一、在C11之前&#xff0c;我们通常采用rand函数来生成随机数。有时我们想用rand生成一组随机数&#xff0c;即使我们调用了srand&#xff0c;但生成的还是相同值。为什么会产生这种情况&#xff1f;又该如何解决&#xff1f;下面将用第一视角一起探究这其中的…

html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染

前言如图所示&#xff0c;webkit内核浏览器的渲染过程(解析HTML&#xff0c;构建DOM树&#xff0c;解析CSS&#xff0c;构建CSSOM树 &#xff0c;构建render树&#xff0c;布局layout&#xff0c;绘制painting)&#xff0c;这些过程理解起来可能有些抽象&#xff0c;今天我们一…

计算机进管理提示找不到入口,win10系统开机提示xxxdll模块已加载但找不到入口点的教程...

有关win10系统开机提示xxxdll模块已加载但找不到入口点的操作方法想必大家有所耳闻。但是能够对win10系统开机提示xxxdll模块已加载但找不到入口点进行实际操作的人却不多。其实解决win10系统开机提示xxxdll模块已加载但找不到入口点的问题也不是难事&#xff0c;小编这里提示两…

十大经典排序,你真的都会了吗?(源码详解)

点击蓝字关注我们一、前言&#xff1a;排序的概念排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键…