Python中使用支持向量机(SVM)算法


Posted in Python onDecember 26, 2017

在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类(异常值检测)以及回归分析。

其具有以下特征:

   (1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。
  (2) SVM通过最大化决策边界的边缘来实现控制模型的能力。尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等。
  (3)SVM一般只能用在二类问题,对于多类问题效果不好。

1. 下面是代码及详细解释(基于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)

#print("预测...")
#res=clf.predict([[2,2]]) ##两个方括号表面传入的参数是矩阵而不是list

##根据训练出的模型绘制样本点
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()

结果如下图:

Python中使用支持向量机(SVM)算法

从图上可以看出,数据明显被蓝色分割线分成了两类。但是红色箭头标示的点例外,所以这也起到了检测异常值的作用。

2.在上面的代码中提到了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中使用支持向量机(SVM)算法

由于样本数据的关系,四个核函数得出的结果一致。在实际操作中,应该选择效果最好的核函数分析。

3.在svm模块中还有一个较为简单的线性分类函数:LinearSVC(),其不支持kernel参数,因为设计思想就是线性分类。如果确定数据

可以进行线性划分,可以选择此函数。跟kernel='linear'用法对比如下:

from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt

##设置子图数量
fig, axes = plt.subplots(nrows=1, ncols=2,figsize=(7,7))
ax0, ax1 = 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]

##设置子图的标题
titles = ['SVC (linear kernel)', 
     'LinearSVC']

##生成随机试验数据(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,2):
    if n==0:
      clf = svm.SVC(kernel='linear').fit(x, y)
      drawPoint(ax0,clf,0)
    else :
      clf= svm.LinearSVC().fit(x, y)
      drawPoint(ax1,clf,1)
  plt.show()

结果如图所示:

Python中使用支持向量机(SVM)算法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现全角半角转换的方法
Aug 18 Python
python实现在sqlite动态创建表的方法
May 08 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
python词云库wordcloud的使用方法与实例详解
Feb 17 Python
python3 logging日志封装实例
Apr 08 Python
Python之字符串的遍历的4种方式
Dec 08 Python
Python字符串格式化方式
Apr 07 Python
Python中支持向量机SVM的使用方法详解
Dec 26 #Python
详解python中的 is 操作符
Dec 26 #Python
matplotlib简介,安装和简单实例代码
Dec 26 #Python
Python中xrange与yield的用法实例分析
Dec 26 #Python
Python简单计算数组元素平均值的方法示例
Dec 26 #Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 #Python
Python之web模板应用
Dec 26 #Python
You might like
input file获得文件根目录简单实现
2013/04/26 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
node.js命令行教程图文详解
2019/05/27 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
Python堆排序原理与实现方法详解
2018/05/11 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python 产生token及token验证的方法
2018/12/26 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
财务主管自我鉴定
2014/01/17 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
高考标语大全
2014/06/05 职场文书
2014年实验室工作总结
2014/12/03 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
全新239军机修复记
2022/04/05 无线电
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby