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 相关文章推荐
在Docker上部署Python的Flask框架的教程
Apr 08 Python
使用Python中的cookielib模拟登录网站
Apr 09 Python
在Python的Django框架中包装视图函数
Jul 20 Python
浅谈Python 对象内存占用
Jul 15 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
详解python运行三种方式
May 13 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 Python
python将dict中的unicode打印成中文实例
May 11 Python
Python如何使用神经网络进行简单文本分类
Feb 25 Python
Python中Permission denied的解决方案
Apr 02 Python
Pandas自定义选项option设置
Jul 25 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
python中time.ctime()实例用法
2021/02/03 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
美国存储和组织商店:The Container Store
2017/08/16 全球购物
英国电器零售商:PRC Direct
2018/06/21 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
新学期标语
2014/06/30 职场文书
办理收楼委托书范本
2014/10/09 职场文书
如何写通讯稿
2015/07/22 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android