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深入学习之内存管理
Aug 31 Python
Python调用C++程序的方法详解
Jan 24 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
python类中super() 的使用解析
Dec 19 Python
python标识符命名规范原理解析
Jan 10 Python
使用python3 实现插入数据到mysql
Mar 02 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
django 实现简单的插入视频
Apr 07 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 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
解决GD中文乱码问题
2007/02/14 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
基于PHP生成静态页的实现方法
2013/05/10 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
Python中的字符串查找操作方法总结
2016/06/27 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
python requests证书问题解决
2019/09/05 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
远程研修随笔感言
2014/02/10 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
防火标语大全
2014/10/06 职场文书
对照四风自我剖析材料
2014/10/07 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
上学路上观后感
2015/06/16 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript