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中的rjust()方法使用详解
May 19 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
pytorch cnn 识别手写的字实现自建图片数据
May 20 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
python 字符串常用函数详解
Sep 11 Python
通过实例了解python property属性
Nov 01 Python
pandas 对group进行聚合的例子
Dec 27 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 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 XML备份Mysql数据库
2009/05/27 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
Python 可爱的大小写
2008/09/06 Python
Python 学习笔记
2008/12/27 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
Python虚拟环境项目实例
2017/11/20 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
详解python中index()、find()方法
2019/08/29 Python
如何把python项目部署到linux服务器
2020/08/26 Python
解决Python安装cryptography报错问题
2020/09/03 Python
使用django自带的user做外键的方法
2020/11/30 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
Linux上比较文件的命令都有哪些
2012/02/24 面试题
初中学生期末评语
2014/04/24 职场文书
小学教师节活动总结
2015/03/20 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书