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 httplib,smtplib使用方法
Sep 06 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
如何在python中使用selenium的示例
Dec 26 Python
python cs架构实现简单文件传输
Mar 20 Python
Django中ORM外键和表的关系详解
May 20 Python
python 魔法函数实例及解析
Sep 25 Python
python字符串格式化方式解析
Oct 19 Python
python实现视频读取和转化图片
Dec 10 Python
Python unittest框架操作实例解析
Apr 13 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 Python
python读写数据读写csv文件(pandas用法)
Dec 14 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
Python-基础-入门 简介
2014/08/09 Python
12步教你理解Python装饰器
2016/02/25 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
食堂员工工作职责
2013/12/18 职场文书
硕士研究生自我鉴定范文
2013/12/27 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
党员承诺书怎么写
2014/05/20 职场文书
新法人代表任命书
2014/06/06 职场文书
通过Python把学姐照片做成拼图游戏
2022/02/15 Python
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫