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批量修改文件后缀示例代码分享
Dec 24 Python
Python存取XML的常见方法实例分析
Mar 21 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
Python基于回溯法子集树模板解决选排问题示例
Sep 07 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
Python3批量移动指定文件到指定文件夹方法示例
Sep 02 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
python相对企业语言优势在哪
Jun 12 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
mac下安装nginx和php
2013/11/04 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
讲解Python中的递归函数
2015/04/27 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
python pandas 时间日期的处理实现
2019/07/30 Python
解析Python3中的Import
2019/10/13 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Django数据统计功能count()的使用
2020/11/30 Python
廉政教育心得体会
2014/01/01 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
运动会拉拉队口号
2014/06/09 职场文书
玄武湖导游词
2015/02/05 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
机器人总动员观后感
2015/06/09 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
详细介绍python操作RabbitMq
2022/04/12 Python