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中实现两个字典(dict)合并的方法
Sep 23 Python
Python运算符重载用法实例分析
Jun 01 Python
python实现多线程的两种方式
May 22 Python
Python数据结构之翻转链表
Feb 25 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
python同步windows和linux文件
Aug 29 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
django 获取字段最大值,最新的记录操作
Aug 09 Python
python集合的新增元素方法整理
Dec 07 Python
七个Python必备的GUI库
Apr 27 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
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
浅谈javascript的数据类型检测
2010/07/10 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
python基于pyDes库实现des加密的方法
2017/04/29 Python
python代码实现ID3决策树算法
2017/12/20 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
pygame实现非图片按钮效果
2019/10/29 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
pytorch的batch normalize使用详解
2020/01/15 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
信息专业个人的自我评价
2013/12/27 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
绿色学校实施方案
2014/03/31 职场文书
工作失职检讨书
2015/01/26 职场文书
网上祭英烈活动总结
2015/02/04 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书