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 相关文章推荐
把MySQL表结构映射为Python中的对象的教程
Apr 07 Python
简单讲解Python中的字符串与字符串的输入输出
Mar 13 Python
在Python中定义和使用抽象类的方法
Jun 30 Python
python实现决策树分类(2)
Aug 30 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 Python
pycharm重命名文件的方法步骤
Jul 29 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
python如何运行js语句
Sep 09 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 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
Syphon 使用方法
2021/03/03 冲泡冲煮
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
composer.lock文件的作用
2016/02/03 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
详解vue路由
2020/08/05 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python基类函数的重载与调用实例分析
2015/01/12 Python
python使用str & repr转换字符串
2016/10/13 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
Bjorn Borg官方网上商店:国际运动时尚品牌
2016/08/27 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
怎样客观的做好自我评价
2013/12/28 职场文书
中国梦的演讲稿
2014/01/08 职场文书
绩效工资分配方案
2014/01/18 职场文书
合伙经营协议书
2014/04/18 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
员工工作心得体会
2019/05/07 职场文书