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多线程编程中的join函数使用心得
Sep 02 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
使用Python对Csv文件操作实例代码
May 12 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
python实现抖音点赞功能
Apr 07 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 Python
Python中的 is 和 == 以及字符串驻留机制详解
Jun 28 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
python如何快速拼接字符串
Oct 28 Python
python中turtle库的简单使用教程
Nov 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选项与信息函数的使用详解
2013/05/10 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python获取央视节目单的实现代码
2015/07/25 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
Java如何支持I18N?
2016/10/31 面试题
公司前台接待岗位职责
2013/12/03 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
学雷锋标语
2014/06/25 职场文书
三好学生个人总结
2015/02/15 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
浅谈MySQL函数
2021/10/05 MySQL