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多线程结合队列下载百度音乐的方法
Jul 27 Python
python创建列表并给列表赋初始值的方法
Jul 28 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
Python使用字典的嵌套功能详解
Feb 27 Python
详解Python函数式编程—高阶函数
Mar 29 Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
Aug 09 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
Python random库使用方法及异常处理方案
Mar 02 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
利用python下载scihub成文献为PDF操作
Jul 09 Python
Python 捕获代码中所有异常的方法
Aug 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获取url的函数代码
2011/08/02 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
JS 常用校验函数
2009/03/26 Javascript
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
js闭包的用途详解
2014/11/09 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
Python通过解析网页实现看报程序的方法
2014/08/04 Python
python 性能提升的几种方法
2016/07/15 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
司机的工作范围及职责
2013/11/13 职场文书
学徒工职责
2014/03/06 职场文书
优秀纪检干部材料
2014/08/27 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
茶花女读书笔记
2015/06/29 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS