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编写Linux系统守护进程实例
Feb 03 Python
python字符串对其居中显示的方法
Jul 11 Python
深入解析Python的Tornado框架中内置的模板引擎
Jul 11 Python
详解python脚本自动生成需要文件实例代码
Feb 04 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
python3.4爬虫demo
Jan 22 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
Feb 26 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 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的网址
2006/11/25 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
深入理解javascript prototype的相关知识
2019/09/19 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
python搜索包的路径的实现方法
2019/07/19 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
Python的垃圾回收机制详解
2019/08/28 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
python manage.py runserver流程解析
2019/11/08 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
介绍一下gcc特性
2012/01/20 面试题
集体婚礼证婚词
2014/01/13 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
社区党建工作方案
2014/06/10 职场文书
工作简报格式范文
2015/07/21 职场文书
Python中itertools库的四个函数介绍
2022/04/06 Python
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers