支持向量机SVM的原理和python实现

这篇具有很好参考价值的文章主要介绍了支持向量机SVM的原理和python实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文主要用来讲述SVM原理与其在python中的使用,更多应用与实现见其他博客:
机器学习-支持向量机

支持向量机SVM的原理和python实现
该图来自于Eren Gogle,由此图可以看出SVM旺盛的生命力。实际上,即使是深度学习非常火热的今天,SVM依然盛行。在一些小样本分类问题上,SVM表现非常好,用深度学习模型可能反而会使问题变得更复杂。

下面将开始介绍SVM算法

1 SVM概述

1.1 概念

支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面,可以将问题化为一个求解凸二次规划的问题。与逻辑回归和神经网络相比,支持向量机,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。

具体来说就是在线性可分时,在原空间寻找两类样本的最优分类超平面。在线性不可分时,加入松弛变量并通过使用非线性映射将低维度输入空间的样本映射到高维度空间使其变为线性可分,这样就可以在该特征空间中寻找最优分类超平面。

SVM使用准则:nn 为特征数,mm 为训练样本数。

如果相较于mm而言,nn要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
如果nn较小,而且mm大小中等,例如nn在 1-1000 之间,而mm在10-10000之间,使用高斯核函数的支持向量机。
如果nn较小,而mm较大,例如nn在1-1000之间,而𝑚大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。

1.2 SVM的优缺点

1.2.1 优点

支持向量机算法可以解决小样本情况下的机器学习问题,简化了通常的分类和回归等问题。
由于采用核函数方法克服了维数灾难和非线性可分的问题,所以向高维空间映射时没有增加计算的复杂性。换句话说,由于支持向量计算法的最终决策函数只由少数的支持向量所确定,所以计算的复杂性取决于支持向量的数目,而不是样本空间的维数。
支持向量机算法利用松弛变量可以允许一些点到分类平面的距离不满足原先要求,从而避免这些点对模型学习的影响。

1.2.2 缺点

支持向量机算法对大规模训练样本难以实施。这是因为支持向量机算法借助二次规划求解支持向量,这其中会涉及m阶矩阵的计算,所以矩阵阶数很大时将耗费大量的机器内存和运算时间。
经典的支持向量机算法只给出了二分类的算法,而在数据挖掘的实际应用中,一般要解决多分类问题,但支持向量机对于多分类问题解决效果并不理想。
SVM算法效果与核函数的选择关系很大,往往需要尝试多种核函数,即使选择了效果比较好的高斯核函数,也要调参选择恰当的参数。另一方面就是现在常用的SVM理论都是使用固定惩罚系数C,但正负样本的两种错误造成的损失是不一样的。

1.3 线性可分思路

由上文可知道SVM(支持向量机)是通过寻找分类超平面进而最大化类别间隔实现分类;

先来介绍一下SVM算法的分类类型,进而介绍SVM算法中提及的最大间隔,分类超平面,及其实现原理。

1.3.1 线性可分样本集与非线性可分样本集

(1)线性可分样本集
线性可分样本集:只要我们可以使用一条直线将样本集完全分开

支持向量机SVM的原理和python实现

(2)非线性可分样本集
非线性可分样本集:没有办法直接画一条直线,只能用曲线等模式来分开的样本集

支持向量机SVM的原理和python实现

1.3.2 分类间隔、超平面、支持向量

下面整体的思路就是由线性可分样本集推到非线性可分的问题
基于线性可分样本集,我们发现只要存在一条直线(一个超平面)可以将类1与类2进行分开。那也就说明实际上有无数条直线(超平面)可以将类1与类2分开。如下图:

支持向量机SVM的原理和python实现

那么问题来了:1 选择哪一条直线(超平面)最好呢?

从图中可以得出,在样本统计中,如果我们是允许误差存在的。那么2号线(超平面)的容错度可能更大一点,就是说线2更加robust,这个超平面离直线两边的数据的间隔最大,对训练集的数据的局限性或噪声有最大的“容忍”能力。

接着,问题又来了,怎么取到2号线(2号超平面)的呢?

解答:随机预测出某条线,然后将这条线进行平行移动,直到它交于某一个圈或某几个圈为止;同理,又进行平移,直到交于某几个星为止,这样我们找到两个相交的线,两条相交线的间隔就是最大分类间隔,间隔的中点位置就是2号线位置。如下图:

支持向量机SVM的原理和python实现

显然,d越大,也就说明红色实线距离样本点越远,此时容错率也就更高。所以我们的目标为:找分类间隔d最大的线,也就是寻找分类间隔最大的超平面。

支持向量机SVM的原理和python实现

1.3.3 SVM算法原理/分类应用(数学描述)

  1. 定义训练数据和标签
    支持向量机SVM的原理和python实现

    • xi:向量。实际上是训练数据集的位置。注意这里是向量,不是支持向量,支持向量是离平面最近的点,也就是平面左右平移中第一个与之相交的点。
    • yi:标签
  2. 训练集线性可分的数学定义
    如图,及如上面的图,1条线把图分为两类,在平面上方>0,在平面下方<0
    支持向量机SVM的原理和python实现所以,同理可得对于超平面来说线性可分的定义如下:
    支持向量机SVM的原理和python实现

  3. 求解向量到超平面的距离
    根据点到平面距离推导向量到超平面的距离:
    支持向量机SVM的原理和python实现

回顾一下点到平面的距离公式:
平面方程为Ax+By+Cz+D=0;点P的坐标(x0,y0,z0);d为点P到平面的距离公式如下:
支持向量机SVM的原理和python实现

  1. 优化目标,利用SVM求出合适的超平面进行分类

1.4 非线性可分思路

关于非线性可分思路的详细推导可以学习:https://blog.csdn.net/u012679707/article/details/80501358

1.4.1 软间隔

软间隔:假如数据是完全的线性可分的,那么学习到的模型可以称为硬间隔支持向量机。换个说法,硬间隔指的就是完全分类准确,不能存在分类错误的情况。软间隔,就是允许一定量的样本分类错误

当容忍一些样本分类错误的线性可分模型,我们可以称为近似线性可分。如下图所示:

支持向量机SVM的原理和python实现
那为了使样本分类不那么严格,我们引入了松弛因子。构建新的目标函数:

支持向量机SVM的原理和python实现

C为常数项,C的右边部分为松弛因子。当常数项越大,松弛因子越小,说明软间隔越小,相反,则软间隔越大。
同时,新的目标函数就是我们讲的“软间隔支持向量机”

1.4.2 核函数

支持向量机SVM的原理和python实现

对于非线性样本集,不论多么高级的线性分类器,都无法处理。

这时,我们需要引入一个新的概念:核函数。它可以将样本从原始空间映射到一个更高维的特质空间中,使得样本在新的空间中线性可分。这样我们就可以使用原来的推导来进行计算,只是所有的推导是在新的空间,而不是在原来的空间中进行。

支持向量机SVM的原理和python实现

所以在非线性 SVM 中,核函数的选择就是影响 SVM 最大的变量。最常用的核函数有线性核、多项式核、高斯核、拉普拉斯核、sigmoid 核,或者是这些核函数的组合。这些函数的区别在于映射方式的不同。通过这些核函数,我们就可以把样本空间投射到新的高维空间中。

常见的核函数为:
支持向量机SVM的原理和python实现

2 在python中使用SVM

2.1 scikit-learn库

Scikit-learn(sklearn)是一个开源项目,可以免费使用和分发,任何人都可以轻松获取其源代码来查看其背后的原理。
scikit-learn是一个非常流行的工具,也是最有名的 Python机器学习库。它广泛应用于工业界和学术界,网上有大量的教程和代码片段。而SVM也可以在scikit-learn库中选择使用。

http:// scikit-learn.org/stable/documentation

2.2 SVM在scikit-learn库中的使用

2.2.1 安装依赖库

  1. 安装numpy
! sudo pip install numpy
  1. 安装 scipy
    需要先安装 matplotlib ipython ipython-notebook pandas sympy
! sudo apt-get install python-matplotlib ipython ipython-notebook
! sudo apt-get install python-pandas python-sympy python-nose
! sudo pip install scipy
  1. 安装 scikit-learn
! sudo pip install -U scikit-learn

2.2.2 svm.SVC

# Create SVM classification object
sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)

参数解析:

  1. C:惩罚参数。C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
  2. kernel:核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
  3. degree:多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
  4. gamma:‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
  5. coef0:核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
  6. probability:是否采用概率估计。默认为False,布尔类型可选。决定是否启用概率估计。需要在训练fit()模型时加上这个参数,之后才能用相关的方法:predict_proba和predict_log_proba
  7. shrinking:是否采用shrinking heuristic方法(启发式收缩),默认为true
  8. tol:停止训练的误差值大小,默认为1e-3
  9. cache_size:核函数cache缓存大小,默认为200
  10. class_weigh: t类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
  11. verbose:允许冗余输出
  12. max_iter:最大迭代次数。-1为无限制。
  13. decision_function_shape:‘ovo’, ‘ovr’ or None, default=None3
  14. random_state:数据洗牌时的种子值,int值。主要调节的参数有:C、kernel、degree、gamma、coef0。

2.2.3 应用实例

采用鸢尾花数据集,这个数据集包含了150个鸢尾花样本,对应3种鸢尾花,各50个样本,以及它们各自对应的4种关于花外形的数据 ,适用于分类任务。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
# 引用 iris 数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 选取前两列作为X参数
y = iris.target # 采集标签作为y参数
C = 1.0 # SVM regularization parameter

# 将所得参数进行模型训练
svc = svm.SVC(kernel='linear', C=1, gamma='auto').fit(X, y)
# 建图
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
 np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1) # 将显示界面分割成1*1 图形标号为1的网格
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()]) # np.c按行连接两个矩阵,但变量为两个数组,按列连接
Z = Z.reshape(xx.shape)# 重新构造行列
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)# 绘制等高线
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) # 生成一个scatter散点图。
plt.xlabel('Sepal length') # x轴标签
plt.ylabel('Sepal width') # y轴标签
plt.xlim(xx.min(), xx.max()) # 设置x轴的数值显示范围
plt.title('SVC with linear kernel') # 设置显示图像的名称
plt.savefig('./test1.png') #存储图像
plt.show() # 显示

实现结果如下:

支持向量机SVM的原理和python实现

总结

支持向量机是一种分类器。之所以称为”机“是因为它会产生一个二值决策的结果,即它是一种决策”机“。支持向量机是一个二分类器。当其解决多分类问题时需要用额外的方法对其进行扩展。而且SVM的效果也对优化参数和所用核函数中的参数敏感。


参考文章:
https://blog.csdn.net/qq_42192693/article/details/121164645
https://blog.csdn.net/u012679707/article/details/80501358
https://blog.csdn.net/Claire_chen_jia/article/details/110916001文章来源地址https://www.toymoban.com/news/detail-501023.html

到了这里,关于支持向量机SVM的原理和python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 支持向量机SVM原理

    目录 支持向量机SVM原理 SVM原理 从线性分类器说起 SVM的目标是最大化分类间隔 转化为对偶问题求解                     【数之道】支持向量机SVM是什么,八分钟直觉理解其本质_哔哩哔哩_bilibili      SVM是由Vapnik等人于1995年提出的,在之后的20多年里它都是最具影响力的机

    2024年02月11日
    浏览(31)
  • 支持向量机svm分类、回归、网格搜索 基于sklearn(python)实现

    由于水平有限 支持向量机(support vector machine)的数学原理和证明就不讲了 想知道可以去看李航的机器学习或者西瓜书 1、读入数据,将数据调成该库能够识别的格式 2、 将数据标准化 ,防止样本中不同特征的数值差别较大,对分类结果产生较大影响 3、利用网格搜索和k折交

    2023年04月11日
    浏览(36)
  • 异常数据检测 | Python实现支持向量机(SVM)的异常数据检测

    文章概述 SVM通常应用于监督式学习,但OneClassSVM算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 模型描述 OneClassSVM的思想来源于这篇论文,SVM使用大边距的方法,它用于异

    2024年02月08日
    浏览(29)
  • 使用SimpleMKL算法实现多核支持向量机(SVM)的Python代码详解

    在本文中,我们将详细介绍如何使用SimpleMKL算法实现多核支持向量机(SVM)的Python代码。我们将首先介绍SimpleMKL算法的基本原理,然后通过实例代码来演示如何在Python中实现该算法。最后,我们将讨论该算法的优缺点以及可能的改进方法。 1. SimpleMKL算法简介 多核学习(Mult

    2024年02月14日
    浏览(103)
  • 机器学习之支持向量机(SVM)对乳腺癌数据二分类python实现

    支持向量机(Support Vector Machines)是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,最终转化为一个凸二次规划问题来求解。 间隔最大化,就是所有样本点中,离我们分类界限超平面最近的样本点,尽可能的远离超平面。这种思想

    2024年02月03日
    浏览(88)
  • 支持向量机(SVM)----超详细原理分析讲解

    支持向量机(Support Vector Machine),是 机器学习 中最流行、最强大的算法模型,没有之一。 但是其背后的模型思想、数学原理较为晦涩难懂,所以本篇文章尽量使用通俗的语言讲解支持向量机的 运行原理 与 数学推导 。 直观的本质理解 我们都知道,支持向量机(SVM)大部分的应

    2024年02月06日
    浏览(34)
  • 基于支持向量机SVM的港口分类,SVM原理,SVM工具箱详解

    目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接: 基于支持向量机SVM的港口分类(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88636296 SVM应用实例, 基于支持向量机SVM的港口

    2024年02月03日
    浏览(34)
  • 支持向量机SVM:从数学原理到实际应用

    本篇文章全面深入地探讨了支持向量机(SVM)的各个方面,从基本概念、数学背景到Python和PyTorch的代码实现。文章还涵盖了SVM在文本分类、图像识别、生物信息学、金融预测等多个实际应用场景中的用法。 关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产

    2024年02月05日
    浏览(64)
  • 支持向量机SVM(包括线性核、多项式核、高斯核)python手写实现+代码框架说明

    理论参考《统计学习方法》Chapter.7 支持向量机(SVM) 完整代码见github仓库:https://github.com/wjtgoo/SVM-python 借鉴sklearn的代码构架,整体功能实现在SVM类中,包括各种类属性,以及常用的模型训练函数 SVM.fit(x,y,iterations) ,以及预测函数 SVM.predict(x) , 类输入参数 kernal: 默认:线性

    2023年04月17日
    浏览(76)
  • [学习笔记] [机器学习] 10. 支持向量机 SVM(SVM 算法原理、SVM API介绍、SVM 损失函数、SVM 回归、手写数字识别)

    视频链接 数据集下载地址:无需下载 学习目标: 了解什么是 SVM 算法 掌握 SVM 算法的原理 知道 SVM 算法的损失函数 知道 SVM 算法的核函数 了解 SVM 算法在回归问题中的使用 应用 SVM 算法实现手写数字识别器 学习目标: 了解 SVM 算法的定义 知道软间隔和硬间隔 在很久以前的

    2024年02月09日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包