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判断值是否在list或set中的性能对比分析
Apr 16 Python
Python网络爬虫出现乱码问题的解决方法
Jan 05 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
python学生管理系统开发
Jan 30 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
django框架模型层功能、组成与用法分析
Jul 30 Python
python urllib爬虫模块使用解析
Sep 05 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
Apr 08 Python
django 获取字段最大值,最新的记录操作
Aug 09 Python
详解python日志输出使用配置文件格式
Feb 10 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
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
Vue.js用法详解
2017/11/13 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
Python如何实现动态数组
2019/11/02 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
VC++笔试题
2014/10/13 面试题
办理退休介绍信
2014/01/09 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
学校周年庆活动方案
2014/08/22 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
vue 实现上传组件
2021/05/31 Vue.js
python爬取某网站原图作为壁纸
2021/06/02 Python
Python提取PDF指定内容并生成新文件
2021/06/09 Python
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
基于Python实现流星雨效果的绘制
2022/03/18 Python