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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
讲解Python中if语句的嵌套用法
May 14 Python
Python爬虫模拟登录带验证码网站
Jan 22 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
详解Django解决ajax跨域访问问题
Aug 24 Python
flask框架url与重定向操作实例详解
Jan 25 Python
Python实现对adb命令封装
Mar 06 Python
Python参数传递对象的引用原理解析
May 22 Python
深入了解Python enumerate和zip
Jul 16 Python
Python延迟绑定问题原理及解决方案
Aug 04 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
jquery tools系列 expose 学习
2009/09/06 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
浅谈js闭包理解
2019/03/28 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
python中map()与zip()操作方法
2016/02/27 Python
Python实现简单登录验证
2016/04/13 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
银行会计主管岗位职责
2014/10/01 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
总结一些Java常用的加密算法
2021/06/11 Java/Android
深入浅析Django MTV模式
2021/09/04 Python
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript