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脚本操作文件的小示例分享
Aug 27 Python
python调用fortran模块
Apr 08 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
Python中类的创建和实例化操作示例
Feb 27 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
Python 实现还原已撤回的微信消息
Jun 18 Python
详解python中__name__的意义以及作用
Aug 07 Python
python deque模块简单使用代码实例
Mar 12 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 Python
Python实现天气查询软件
Jun 07 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使用反射插入对象示例分享
2014/03/11 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
vue组件的写法汇总
2018/04/12 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
分享Python字符串关键点
2015/12/13 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
Python的高阶函数用法实例分析
2019/04/11 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
会计专业毕业生自我评价
2013/09/25 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
中学生思想品德评语
2014/12/31 职场文书
教师节感谢信
2015/01/22 职场文书
个人思想政治总结
2015/03/05 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL