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实现逆波兰计算表达式实例详解
May 06 Python
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
django之自定义软删除Model的方法
Aug 14 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
python UDF 实现对csv批量md5加密操作
Jan 01 Python
Python Flask请求扩展与中间件相关知识总结
Jun 11 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
javascript 学习之旅 (2)
2009/02/05 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
Python快速排序算法实例分析
2017/11/29 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
pandas中ix的使用详细讲解
2020/03/09 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
数据库的约束含义
2012/09/09 面试题
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
三年级评语大全
2014/04/23 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
销售员态度差检讨书
2014/10/26 职场文书
个人先进材料范文
2014/12/30 职场文书
python随机打印成绩排名表
2021/06/23 Python
windows server2008 开启端口的实现方法
2022/06/25 Servers