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常用知识点汇总
May 08 Python
Python实现发送QQ邮件的封装
Jul 14 Python
Python实现的弹球小游戏示例
Aug 01 Python
scrapy爬虫完整实例
Jan 25 Python
python查看列的唯一值方法
Jul 17 Python
Django中的Model操作表的实现
Jul 24 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
Python读写csv文件流程及异常解决
Oct 20 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 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单文件版在线代码编辑器
2015/03/12 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php生成验证码函数
2015/10/20 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Python Socket使用实例
2017/12/18 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
python3注册全局热键的实现
2020/03/22 Python
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
初任培训自我鉴定
2013/10/07 职场文书
总经理驾驶员岗位职责
2013/12/04 职场文书
饭店工作计划书
2014/01/10 职场文书
毕业论文致谢词
2015/05/14 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
Redis RDB技术底层原理详解
2021/09/04 Redis