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的ORM框架SQLAlchemy入门教程
Apr 28 Python
Python fileinput模块使用介绍
Nov 30 Python
Python实现完整的事务操作示例
Jun 20 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
python去掉空白行的多种实现代码
Mar 19 Python
Python内置函数reversed()用法分析
Mar 20 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
Python 面试中 8 个必考问题
Nov 16 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
python3的UnicodeDecodeError解决方法
Dec 20 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 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入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
python实现扫描日志关键字的示例
2018/04/28 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
django 自定义过滤器的实现
2019/02/26 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
新西兰优惠网站:Treat Me
2019/07/04 全球购物
中学生差生评语
2014/01/30 职场文书
中专自我鉴定
2014/02/05 职场文书
公司节能减排方案
2014/05/16 职场文书
毕业生党员个人总结
2015/02/14 职场文书
水电工岗位职责
2015/02/14 职场文书
天气温馨提示语
2015/07/14 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers