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 输出一个两行字符的变量
Feb 05 Python
Python中使用PIPE操作Linux管道
Feb 04 Python
Python新手在作用域方面经常容易碰到的问题
Apr 03 Python
python实现将元祖转换成数组的方法
May 04 Python
python中argparse模块用法实例详解
Jun 03 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
Python函数装饰器实现方法详解
Dec 22 Python
python实现合并两个排序的链表
Mar 03 Python
django model object序列化实例
Mar 13 Python
如何利用python读取micaps文件详解
Oct 18 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
Python使用sorted排序的方法小结
2017/07/28 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
django2.0扩展用户字段示例
2019/02/13 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
struct和class的区别
2015/11/20 面试题
学生会主席演讲稿
2014/04/25 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
代办出身证明书
2014/10/21 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
阳光体育运动标语口号
2015/12/26 职场文书