Python中使用支持向量机SVM实践


Posted in Python onDecember 27, 2017

在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类(异常值检测)以及回归分析。

其具有以下特征:

   (1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。

  (2) SVM通过最大化决策边界的边缘来实现控制模型的能力。尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等。

  (3)SVM一般只能用在二类问题,对于多类问题效果不好。

代码及详细解释(基于sklearn包):

from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt

#准备训练样本
x=[[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]
y=[1,1,-1,-1,1,-1,-1,1]

##开始训练
clf=svm.SVC() ##默认参数:kernel='rbf'
clf.fit(x,y)
##根据训练出的模型绘制样本点
for i in x:
  res=clf.predict(np.array(i).reshape(1, -1))
  if res > 0:
    plt.scatter(i[0],i[1],c='r',marker='*')
  else :
    plt.scatter(i[0],i[1],c='g',marker='*')

##生成随机实验数据(15行2列)
rdm_arr=np.random.randint(1, 15, size=(15,2))
##回执实验数据点
for i in rdm_arr:
  res=clf.predict(np.array(i).reshape(1, -1))
  if res > 0:
    plt.scatter(i[0],i[1],c='r',marker='.')
  else :
    plt.scatter(i[0],i[1],c='g',marker='.')
##显示绘图结果
plt.show()

从图上可以看出,数据明显被蓝色分割线分成了两类。但是红色箭头标示的点例外,所以这也起到了检测异常值的作用。
上面的代码中提到了kernel='rbf',这个参数是SVM的核心:核函数

重新整理后的代码如下:  

from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt

##设置子图数量
fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(7,7))
ax0, ax1, ax2, ax3 = axes.flatten()

#准备训练样本
x=[[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]
y=[1,1,-1,-1,1,-1,-1,1]
'''
  说明1:
    核函数(这里简单介绍了sklearn中svm的四个核函数,还有precomputed及自定义的)
    
  LinearSVC:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想
  RBF:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数
  polynomial:多项式函数,degree 表示多项式的程度-----支持非线性分类
  Sigmoid:在生物学中常见的S型的函数,也称为S型生长曲线

  说明2:根据设置的参数不同,得出的分类结果及显示结果也会不同
  
'''
##设置子图的标题
titles = ['LinearSVC (linear kernel)', 
     'SVC with polynomial (degree 3) kernel', 
     'SVC with RBF kernel',   ##这个是默认的
     'SVC with Sigmoid kernel']
##生成随机试验数据(15行2列)
rdm_arr=np.random.randint(1, 15, size=(15,2))

def drawPoint(ax,clf,tn):
  ##绘制样本点
  for i in x:
    ax.set_title(titles[tn])
    res=clf.predict(np.array(i).reshape(1, -1))
    if res > 0:
      ax.scatter(i[0],i[1],c='r',marker='*')
    else :
      ax.scatter(i[0],i[1],c='g',marker='*')
   ##绘制实验点
  for i in rdm_arr:
    res=clf.predict(np.array(i).reshape(1, -1))
    if res > 0:
      ax.scatter(i[0],i[1],c='r',marker='.')
    else :
      ax.scatter(i[0],i[1],c='g',marker='.')

if __name__=="__main__":
  ##选择核函数
  for n in range(0,4):
    if n==0:
      clf = svm.SVC(kernel='linear').fit(x, y)
      drawPoint(ax0,clf,0)
    elif n==1:
      clf = svm.SVC(kernel='poly', degree=3).fit(x, y)
      drawPoint(ax1,clf,1)
    elif n==2:
      clf= svm.SVC(kernel='rbf').fit(x, y)
      drawPoint(ax2,clf,2)
    else :
      clf= svm.SVC(kernel='sigmoid').fit(x, y)
      drawPoint(ax3,clf,3)
  plt.show()

由于样本数据的关系,四个核函数得出的结果一致。在实际操作中,应该选择效果最好的核函数分析。

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

Python 相关文章推荐
python定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
Python中lambda的用法及其与def的区别解析
Jul 28 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
Nov 29 Python
有关Python的22个编程技巧
Aug 29 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
使用PyOpenGL绘制三维坐标系实例
Dec 24 Python
Python第三方库安装缓慢的解决方法
Feb 06 Python
Python基础详解之描述符
Apr 28 Python
python基于tkinter实现gif录屏功能
May 19 Python
python中opencv实现图片文本倾斜校正
Jun 11 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 #Python
Python简单生成随机姓名的方法示例
Dec 27 #Python
ubuntu中配置pyqt4环境教程
Dec 27 #Python
Python中Threading用法详解
Dec 27 #Python
SVM基本概念及Python实现代码
Dec 27 #Python
Python自定义函数定义,参数,调用代码解析
Dec 27 #Python
详解用Python处理HTML转义字符的5种方式
Dec 27 #Python
You might like
用PHP读取RSS feed的代码
2008/08/01 PHP
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
PHP文件操作实现代码分享
2011/09/01 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
vue-router history模式下的微信分享小结
2018/07/05 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
应届大专毕业生个人自荐信
2013/09/22 职场文书
护理自荐信
2013/10/22 职场文书
心理健康课教学反思
2014/02/13 职场文书
旷课检讨书范文
2014/10/30 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
党课主持词大全
2015/06/30 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android