Python 支持向量机分类器的实现


Posted in Python onJanuary 15, 2020

支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)

SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一。

SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别(pattern recognition)问题中有得到应用。

import numpy as np
from scipy import io as spio
from matplotlib import pyplot as plt
from sklearn import svm
 
 
def SVM():
  '''data1——线性分类'''
  data1 = spio.loadmat('data1.mat')
  X = data1['X']
  y = data1['y']
  y = np.ravel(y)
  plot_data(X, y)
 
  model = svm.SVC(C=1.0, kernel='linear').fit(X, y) # 指定核函数为线性核函数
  plot_decisionBoundary(X, y, model) # 画决策边界
  '''data2——非线性分类'''
  data2 = spio.loadmat('data2.mat')
  X = data2['X']
  y = data2['y']
  y = np.ravel(y)
  plt = plot_data(X, y)
  plt.show()
 
  model = svm.SVC(gamma=100).fit(X, y) # gamma为核函数的系数,值越大拟合的越好
  plot_decisionBoundary(X, y, model, class_='notLinear') # 画决策边界
 
 
# 作图
def plot_data(X, y):
  plt.figure(figsize=(10, 8))
  pos = np.where(y == 1) # 找到y=1的位置
  neg = np.where(y == 0) # 找到y=0的位置
  p1, = plt.plot(np.ravel(X[pos, 0]), np.ravel(X[pos, 1]), 'ro', markersize=8)
  p2, = plt.plot(np.ravel(X[neg, 0]), np.ravel(X[neg, 1]), 'g^', markersize=8)
  plt.xlabel("X1")
  plt.ylabel("X2")
  plt.legend([p1, p2], ["y==1", "y==0"])
  return plt
 
 
# 画决策边界
def plot_decisionBoundary(X, y, model, class_='linear'):
  plt = plot_data(X, y)
 
  # 线性边界    
  if class_ == 'linear':
    w = model.coef_
    b = model.intercept_
    xp = np.linspace(np.min(X[:, 0]), np.max(X[:, 0]), 100)
    yp = -(w[0, 0] * xp + b) / w[0, 1]
    plt.plot(xp, yp, 'b-', linewidth=2.0)
    plt.show()
  else: # 非线性边界
    x_1 = np.transpose(np.linspace(np.min(X[:, 0]), np.max(X[:, 0]), 100).reshape(1, -1))
    x_2 = np.transpose(np.linspace(np.min(X[:, 1]), np.max(X[:, 1]), 100).reshape(1, -1))
    X1, X2 = np.meshgrid(x_1, x_2)
    vals = np.zeros(X1.shape)
    for i in range(X1.shape[1]):
      this_X = np.hstack((X1[:, i].reshape(-1, 1), X2[:, i].reshape(-1, 1)))
      vals[:, i] = model.predict(this_X)
 
    plt.contour(X1, X2, vals, [0, 1], color='blue')
    plt.show()
 
 
if __name__ == "__main__":
  SVM()

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

Python 相关文章推荐
Python中random模块用法实例分析
May 19 Python
Python实现简单的四则运算计算器
Nov 02 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
Sanic框架应用部署方法详解
Jul 18 Python
Django Rest framework之权限的实现示例
Dec 17 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
python统计中文字符数量的两种方法
Jan 31 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
python如何实时获取tcpdump输出
Sep 16 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 Python
Python面向对象编程之类的概念
Nov 01 Python
pytorch-神经网络拟合曲线实例
Jan 15 #Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 #Python
详解Python3 中的字符串格式化语法
Jan 15 #Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 #Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 #Python
Python实现bilibili时间长度查询的示例代码
Jan 14 #Python
基于python监控程序是否关闭
Jan 14 #Python
You might like
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
js查找节点的方法小结
2015/01/13 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
学习Python列表的基础知识汇总
2020/03/10 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
pandas针对excel处理的实现
2021/01/15 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
俄语专业职业生涯规划
2014/02/26 职场文书
十佳青年事迹材料
2014/08/21 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
文明礼貌主题班会
2015/08/14 职场文书