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 10 Python
快速入手Python字符编码
Aug 03 Python
Python实现数据库并行读取和写入实例
Jun 09 Python
python+pandas生成指定日期和重采样的方法
Apr 11 Python
浅谈numpy数组中冒号和负号的含义
Apr 18 Python
Python编程深度学习绘图库之matplotlib
Dec 28 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
python redis 批量设置过期key过程解析
Nov 26 Python
基于python实现文件加密功能
Jan 06 Python
PyCharm第一次安装及使用教程
Jan 08 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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生成rss类用法实例
2015/04/14 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
vue.js实现标签页切换效果
2018/06/07 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
python ansible服务及剧本编写
2017/12/29 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Python threading的使用方法解析
2019/08/28 Python
Python3爬虫中识别图形验证码的实例讲解
2020/07/30 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
一些Solaris面试题
2013/03/22 面试题
巧克力蛋糕店创业计划书
2014/01/14 职场文书
大学运动会通讯稿
2014/01/28 职场文书
社团文化节策划书
2014/02/01 职场文书
大学生就业自荐书
2014/06/16 职场文书
工厂车间标语
2014/06/19 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS