Python 支持向量机分类器的实现

支持向量机(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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python SVM(支持向量机)实现方法完整示例

    本文实例讲述了Python SVM(支持向量机)实现方法.分享给大家供大家参考,具体如下: 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=>end: 结束 op1=>operation: 读入数据 op2=>operation: 格式化数据 cond=>condition: 是否达到迭代次数 op3=>operation: 寻找超平面分割最小间隔 ccond=>cond

  • python 机器学习之支持向量机非线性回归SVR模型

    本文介绍了python 支持向量机非线性回归SVR模型,废话不多说,具体如下: import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm from sklearn.model_selection import train_test_split def load_data_regression(): ''' 加载用于回归问题的数据集 ''' diabetes =

  • python机器学习理论与实战(六)支持向量机

    上节基本完成了SVM的理论推倒,寻找最大化间隔的目标最终转换成求解拉格朗日乘子变量alpha的求解问题,求出了alpha即可求解出SVM的权重W,有了权重也就有了最大间隔距离,但是其实上节我们有个假设:就是训练集是线性可分的,这样求出的alpha在[0,infinite].但是如果数据不是线性可分的呢?此时我们就要允许部分的样本可以越过分类器,这样优化的目标函数就可以不变,只要引入松弛变量即可,它表示错分类样本点的代价,分类正确时它等于0,当分类错误时,其中Tn表示样本的真实标签-1或者1,回顾

  • python机器学习理论与实战(五)支持向量机

    做机器学习的一定对支持向量机(support vector machine-SVM)颇为熟悉,因为在深度学习出现之前,SVM一直霸占着机器学习老大哥的位子.他的理论很优美,各种变种改进版本也很多,比如latent-SVM, structural-SVM等.这节先来看看SVM的理论吧,在(图一)中A图表示有两类的数据集,图B,C,D都提供了一个线性分类器来对数据进行分类?但是哪个效果好一些? (图一) 可能对这个数据集来说,三个的分类器都一样足够好了吧,但是其实不然,这个只是训练集,现实测试的样本

  • Python机器学习之SVM支持向量机

    SVM支持向量机是建立于统计学习理论上的一种分类算法,适合与处理具备高维特征的数据集. SVM算法的数学原理相对比较复杂,好在由于SVM算法的研究与应用如此火爆,CSDN博客里也有大量的好文章对此进行分析,下面给出几个本人认为讲解的相当不错的: 支持向量机通俗导论(理解SVM的3层境界) JULY大牛讲的是如此详细,由浅入深层层推进,以至于关于SVM的原理,我一个字都不想写了..强烈推荐. 还有一个比较通俗的简单版本的:手把手教你实现SVM算法 SVN原理比较复杂,但是思想很简单,一句话概括,就

  • Python中的支持向量机SVM的使用(附实例代码)

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导入sklearn算法包 Scikit-Learn库已经实现了所有基本机器学习的算法,具体使用详见官方文档说明:http://scikit-learn.org/stable/auto_examples/index.html. skleran中集成了许多算法,其导入包的方式如下所示, 逻辑回归:from

  • Python中使用支持向量机SVM实践

    在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异常值检测)以及回归分析. 其具有以下特征: (1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值.而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解. (2) SVM通过最大化决策边界的边缘来实现控制模型的能力.尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等. (3)SVM一般

  • Python中支持向量机SVM的使用方法详解

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导入sklearn算法包 Scikit-Learn库已经实现了所有基本机器学习的算法,具体使用详见官方文档说明 skleran中集成了许多算法,其导入包的方式如下所示, 逻辑回归:from sklearn.linear_model import LogisticRegression 朴素贝叶斯:fro

  • Python中使用支持向量机(SVM)算法

    在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异常值检测)以及回归分析. 其具有以下特征: (1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值.而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解.   (2) SVM通过最大化决策边界的边缘来实现控制模型的能力.尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等.   (3)S

  • Python 支持向量机分类器的实现

    支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane) SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个

  • 详解python 支持向量机(SVM)算法

    相比于逻辑回归,在很多情况下,SVM算法能够对数据计算从而产生更好的精度.而传统的SVM只能适用于二分类操作,不过却可以通过核技巧(核函数),使得SVM可以应用于多分类的任务中. 本篇文章只是介绍SVM的原理以及核技巧究竟是怎么一回事,最后会介绍sklearn svm各个参数作用和一个demo实战的内容,尽量通俗易懂.至于公式推导方面,网上关于这方面的文章太多了,这里就不多进行展开了~ 1.SVM简介 支持向量机,能在N维平面中,找到最明显得对数据进行分类的一个超平面!看下面这幅图: 如上图中,

  • Python机器学习应用之支持向量机的分类预测篇

    目录 1.Question? 2.Answer!——SVM 3.软间隔 4.超平面 支持向量机常用于数据分类,也可以用于数据的回归预测 1.Question? 我们经常会遇到这样的问题,给你一些属于两个类别的数据(如子图1),需要一个线性分类器将这些数据分开,有很多分法(如子图2),现在有一个问题,两个分类器,哪一个更好?为了判断好坏,我们需要引入一个准则:好的分类器不仅仅能够很好的分开已有的数据集,还能对为知的数据进行两个划分,假设现在有一个属于红色数据点的新数据(如子图3中的绿三角),可以看

  • python中opencv支持向量机的实现

    目录 支持向量机 理论基础 SVM使用介绍 例子介绍 完整程序 支持向量机 支持向量机(Support Vector Machine, SVM)是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大). 当数据集较小时,使用支持向量机进行分类非常有效. 支持向量机是最好的现成分类器之一,“现成”是指分类器不加修改即可直接使用. 在对原始数据分类的过程中,可能无法使用线性方法实现分割.支持向量机在分类时,把无法线性分割的数据映射到高维空

  • 用TensorFlow实现多类支持向量机的示例代码

    本文将详细展示一个多类支持向量机分类器训练iris数据集来分类三种花. SVM算法最初是为二值分类问题设计的,但是也可以通过一些策略使得其能进行多类分类.主要的两种策略是:一对多(one versus all)方法:一对一(one versus one)方法. 一对一方法是在任意两类样本之间设计创建一个二值分类器,然后得票最多的类别即为该未知样本的预测类别.但是当类别(k类)很多的时候,就必须创建k!/(k-2)!2!个分类器,计算的代价还是相当大的. 另外一种实现多类分类器的方法是一对多,其为

随机推荐