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 中文字符串的处理实现代码
Oct 25 Python
Python进程通信之匿名管道实例讲解
Apr 11 Python
Python入门教程之运算符与控制流
Aug 17 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
Python动态生成多维数组的方法示例
Aug 09 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
Python常用库大全及简要说明
Jan 17 Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 Python
Python中itertools库的四个函数介绍
Apr 06 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实现读取一个1G的文件大小
2013/08/24 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
JavaScript 函数调用规则
2009/09/14 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
2010/10/14 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
如何在django中添加日志功能
2020/02/06 Python
Python中的With语句的使用及原理
2020/07/29 Python
Python如何将装饰器定义为类
2020/07/30 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
索尼巴西商店:Sony巴西
2019/06/21 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
后勤主管工作职责
2013/12/07 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
同学毕业留言寄语
2015/02/27 职场文书
红楼梦读书笔记
2015/06/25 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
Docker部署Mysql8的实现步骤
2022/07/07 Servers