机器学习(17)---支持向量机(SVM)

news2024/9/29 7:29:13

支持向量机

  • 一、概述
    • 1.1 介绍
    • 1.2 工作原理
    • 1.3 三层理解
  • 二、sklearn.svm.SVC
    • 2.1 查看数据集
    • 2.2 contour函数
    • 2.3 画决策边界:制作网格
    • 2.4 建模画图
  • 三、非线性情况推广
    • 3.1 查看数据集
    • 3.2 线性画图
    • 3.3 为非线性数据增加维度并绘制3D图像
  • 四、核函数


一、概述

1.1 介绍

 1. 支持向量机(SVM,也称为支持向量网络),最擅长分类问题。

在这里插入图片描述

 2.(1)从实际应用来看,SVM在各种实际问题中都表现非常优秀。它在手写识别数字和人脸识别中应用广泛,在文本和超文本的分类中举足轻重,因为SVM可以大量减少标准归纳(standard inductive)和转换设置(transductivesettings)中对标记训练实例的需求。 (2)从学术的角度来看,SVM是最接近深度学习的机器学习算法。线性SVM可以看成是神经网络的单个神经元(虽然损失函数与神经网络不同),非线性的SVM则与两层的神经网络相当,非线性的SVM中如果添加多个核函数,则可以模仿多层的神经网络。

1.2 工作原理

 1. 超平面:在几何中,超平面是一个空间的子空间,它是维度比所在空间小一维的空间。 如果数据空间本身是三维的,则其超平面是二维平面;而如果数据空间本身是二维的,则其超平面是一维的直线。在二分类问题中,如果一个超平面能够将数据划分为两个集合,其中每个集合中包含单独的一个类别,我们就说这个超平面是数据的“决策边界”。

 2. 先来看看下面这一组数据的分布,这是一组两种标签的数据,两种标签分别由圆和方块代表。支持向量机的分类方法,是在这组分布中找出一个超平面作为决策边界,使模型在数据上的分类误差尽量接近于小,尤其是在未知数据集上的分类误差(泛化误差)尽量小。

在这里插入图片描述

 3. 决策边界一侧的所有点在分类为属于一个类,而另一侧的所有点分类属于另一个类。如果我们能够找出决策边界,分类问题就可以变成探讨每个样本对于决策边界而言的相对位置。比如上面的数据分布,我们很容易就可以在方块和圆的中间画出一条线,并让所有落在直线左边的样本被分类为方块,在直线右边的样本被分类为圆。如果把数据当作我们的训练集,只要直线的一边只有一种类型的数据,就没有分类错误,我们的训练误差就会为0。

 4. 但是,对于一个数据集来说,让训练误差为0的决策边界可以有无数条。在此基础上,我们无法保证这条决策边界在未知数据集(测试集)上的表现也会优秀。对于现有的数据集来说,我们有B1和B2两条可能的决策边界。我们可以把决策边界B1向两边平移,直到碰到离这条决策边界最近的方块和圆圈后停下,形成两个新的超平面,分别是b11和b12。并且我们将原始的决策边界移动到b11和b12的中间,确保B1到b11和b12的距离相等。在b11和b12中间的距离,叫做 这条决策边界的边际(margin),通常记作d。
 对B2也执行同样的操作,然后我们来对比一下两个决策边界。现在两条决策边界右边的数据都被判断为圆,左边的数据都被判断为方块,两条决策边界在现在的数据集上的训练误差都是0,没有一个样本被分错。

在这里插入图片描述

 5. 我们引入和原本的数据集相同分布的测试样本(红色所示),平面中的样本变多了,此时我们可以发现,对于B1而言,依然没有一个样本被分错,这条决策边界上的泛化误差也是0。但是对于B2而言,却有三个方块被误分类成了圆,二有两个圆被误分类成了方块,这条决策边界上的泛化误差就远远大于B1了。这个例子表现出,拥有更大边际的决策边界在分类中的泛化误差更小,这一点可以由结构风险最小化定律来证明(SRM)。如果边际很小,则任何轻微扰动都会对决策边界的分类产生很大的影响。边际很小的情况,是一种模型在训练集上表现很好,却在测试集上表现糟糕的情况,所以会“过拟合”。所以我们在找寻决策边界的时候,希望边际越大越好。

在这里插入图片描述

 6. 支持向量机,就是通过找出边际最大的决策边界,来对数据进行分类的分类器。也因此,支持向量分类器又叫做最大边际分类器。这个过程在二维平面中看起来十分简单,但将上述过程使用数学表达出来,就不是一件简单的事情了。

1.3 三层理解

在这里插入图片描述

二、sklearn.svm.SVC

2.1 查看数据集

from sklearn.datasets import make_blobs   #生成聚类数据集
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

x,y=make_blobs(n_samples=100,centers=2,random_state=0,cluster_std=0.6)
plt.scatter(x[:,0],x[:,1],c=y,s=50,cmap='rainbow')
plt.show()

在这里插入图片描述

2.2 contour函数

 1. 函数:matplotlib.axes.Axes.contour([X, Y,] Z, [levels], **kwargs)

 2. Contour是我们专门用来绘制等高线的函数。等高线,本质上是在二维图像上表现三维图像的一种形式,其中两维X和Y是两条坐标轴上的取值,而Z表示高度。Contour就是将由X和Y构成平面上的所有点中,高度一致的点连接成线段的函数,在同一条等高线上的点一定具有相同的Z值。我们可以利用这个性质来绘制我们的决策边界。

参数含义
X和Y选填。两维平面上所有的点的横纵坐标取值,一般要求是二维结构并且形状需要与Z相同,往往通过numpy.meshgrid()这样的函数来创建。如果X和Y都是一维,则Z的结构必须为(len(Y), len(X))。如果不填写,则默认X = range(Z.shape[1]),Y = range(Z.shape[0])。
Z必填。平面上所有的点所对应的高度。
levels可不填,不填默认显示所有的等高线,填写用于确定等高线的数量和位置。如果填写整数n,则显示n个数据区间,即绘制n+1条等高线。水平高度自动选择。如果填写的是数组或列表,则在指定的高度级别绘制等高线。列表或数组中的值必须按递增顺序排列。

2.3 画决策边界:制作网格

ax = plt.gca()
xlim = ax.get_xlim()  # 返回上面图的x轴的最小值和最大值
ylim = ax.get_ylim()  # 返回上面图的y轴的最小值和最大值

# print(xlim,ylim)    #(-0.7425578984849813, 3.3721920271976598) (-0.41872382476349596, 5.754870487889891)

axisx = np.linspace(xlim[0], xlim[1], 30)  # 根据xlim和ylim绘制网格点
axisy = np.linspace(ylim[0], ylim[1], 30)
print(axisx, axisy)

axisx, axisy = np.meshgrid(axisx, axisy)  # 将axisx和axisy分别向y轴和x轴进行扩充(广播)

xy = np.vstack([axisx.ravel(), axisy.ravel()]).T  # 扩充为30*30的坐标点,后面基于这900个点绘制决策边界

plt.scatter(xy[:, 0], xy[:, 1], s=1, cmap="rainbow")
plt.show()

在这里插入图片描述

2.4 建模画图

clf=SVC(kernel='linear').fit(x,y)                #建模
z=clf.decision_function(xy).reshape(axisx.shape) #每个样本所对应的到决策边界的距离

def plot_svc_decision_funtion(model, ax=None):
    if ax is None:
        ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    x = np.linspace(xlim[0], xlim[1], 30)
    y = np.linspace(ylim[0], ylim[1], 30)

    y, x = np.meshgrid(y, x)
    xy = np.vstack([x.ravel(), y.ravel()]).T
    P = model.decision_function(xy).reshape(x.shape)

    ax.contour(x, y, P, colors='k',
               levels=[-1, 0, 1],
               alpha=0.5,
               linestyles=['--', '-', '--'])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)

    plt.show()
plt.scatter(x[:,0],x[:,1],c=y,s=50,cmap='rainbow')
plot_svc_decision_funtion(clf)

在这里插入图片描述

三、非线性情况推广

3.1 查看数据集

from sklearn.datasets import make_circles
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
X,y = make_circles(100, factor=0.1, noise=.1)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plt.show()

在这里插入图片描述

3.2 线性画图

 明显,现在线性SVM已经不适合于我们的状况了,我们无法找出一条直线来划分我们的数据集,让直线的两边分别是两种类别。这个时候,如果我们能够在原本的X和y的基础上,添加一个维度r,变成三维,我们再可视化这个数据,来看看添加维度让我们的数据如何变化。

def plot_svc_decision_function(model, ax=None):
    if ax is None:
        ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    x = np.linspace(xlim[0], xlim[1], 30)
    y = np.linspace(ylim[0], ylim[1], 30)

    y, x = np.meshgrid(y, x)
    xy = np.vstack([x.ravel(), y.ravel()]).T
    P = model.decision_function(xy).reshape(x.shape)

    ax.contour(x, y, P, colors='k',
               levels=[-1, 0, 1],
               alpha=0.5,
               linestyles=['--', '-', '--'])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    plt.show()
clf = SVC(kernel = "linear").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plot_svc_decision_function(clf)

在这里插入图片描述

3.3 为非线性数据增加维度并绘制3D图像

r = np.exp(-(X**2).sum(1))
rlim = np.linspace(min(r),max(r),1)
def plot_3D(elev=30,azim=30,X=X,y=y):
    ax = plt.subplot(projection="3d")
    ax.scatter3D(X[:,0],X[:,1],r,c=y,s=50,cmap='rainbow')
    ax.view_init(elev=elev,azim=azim)
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.set_zlabel("r")
    plt.show()

plot_3D()

在这里插入图片描述

四、核函数

 1. 是一种能够使用数据原始空间中的向量计算来表示升维后的空间中的点积结果的数学方式。具体表现为:

在这里插入图片描述

 2. 核函数确保了高维空间中任意两个向量的点积一定可以被低维空间中的这两个向量的某种计算来表示(多数时候是点积的某种变换)。选用不同的核函数,就可以解决不同数据分布下的寻找超平面问题。在SVC中,这个功能由参数“kernel”和一系列与核函数相关的参数来进行控制。之前的代码中我们一直使用这个参数并输入"linear"。参数“kernel"在sklearn中可选以下几种选项:

在这里插入图片描述

 3. 使用其它的核函数画决策边界:

clf = SVC(kernel = "rbf").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plot_svc_decision_function(clf)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次 mysql 数据库定时备份

环境:Centos 7.9 数据库:mysql 8.0.30 需求:生产环境 mysql 数据(约670MB)备份。其中存在大字段、longblob字段 参考博客:Linux环境下使用crontab实现mysql定时备份 - 知乎 一、数据库备份 1. 备份脚本。创…

Python项目Flask ipv6双栈支持改造

一、背景 Flask 是一个微型的(轻量)使用Python 语言开发的 WSGI Web 框架(一组库和模块),基于Werkzeug WSGI工具箱/库和Jinja2 模板引擎,当然,Python的WEB框架还有:Django、Tornado、Webpy,这暂且不提。 Flask使用BSD授权。 Flask也被称为microframework(微框架),F…

RFID技术在工业智能制造生产线中的应用

随着自动化和信息化的快速发展,工业智能制造成为制造业的重要趋势,在制造商的生产线上,准确获取和管理工艺流程等各个环节的信息至关重要,作为物联网感知层的核心组成部分,RFID技术以其非接触式、无感知的特点&#xf…

隔山打牛:金融大崩溃

当2004-2006年美联储主席格林斯潘在任期的末尾一鼓作气把联邦利率从1%拉高到5%,然后把美联储主席的位子交给继任者伯南克的时候,没有人意识到接下来将要发生何等巨变。 图:美国联邦利率 伯南克把利率稳定在5.3%附近的高位一年左右时间&#x…

【ArcGIS】基本概念-矢量空间分析

栅格数据与矢量数据 1.1 栅格数据 栅格图是一个规则的阵列,包含着一定数量的像元或者栅格 常用的栅格图格式有:tif,png,jpeg/jpg等 1.2 矢量数据 矢量图是由一组描述点、线、面,以及它们的色彩、位置的数据&#x…

无涯教程-JavaScript - AVEDEV函数

描述 AVEDEV函数返回数据点与其平均值的绝对偏差的平均值。 AVEDEV是数据集中变异性的量度。 语法 AVEDEV (number1, [number2] ...)争论 Argument描述Required/OptionalNumber11 to 255 arguments for which you want the average of the absolute deviations.Requirednum…

趴趴雅思作文修改

前言 在网上试了下趴趴雅思作文修改的服务,淘宝上直接就可以购买,首次有优惠,之后还是挺贵的。 用了下感觉,有用还是有用的,但是挺贵的,一次40,不值。他给我作文的评分是7分,应该给…

fineReport11.0.4版本新建数据链接

需要以下几步: 1.设计器和服务器都需要安装对应数据库的驱动(已安装就跳过) 对应驱动可以在官网下载,百度搜下有教程 2.服务器没有驱动需要上传驱动 2.1 服务器上传驱动文件,需要修改finedb中的fine_conf_entity表…

Mobpush上线跨时区推送功能,助力中国开发者应用出海

近年来随着国内移动应用存量市场饱和,国内移动应用厂商转向”移动出海“,把握国际市场中存在结构性发展机会,提升中国品牌移动应用的知名度和影响力。根据公开资料显示,中国应用开发者中有79.1%计划出海,其中43%的开发…

极光笔记 | 大语言模型插件

在人工智能领域,大语言模型(LLMs)是根据预训练数据集进行”学习“,获取可以拟合结果的参数,虽然随着参数的增加,模型的功能也会随之增强。但无论专业领域的小模型,还是当下最火、效果最好的大模…

分享一下微信公众号怎么实现积分商城功能

微信公众号作为一种社交媒体平台,可以帮助商家与消费者进行互动和沟通。除了实现微信拼团活动外,微信公众号还可以实现积分商城功能,提高消费者的参与度和忠诚度。本文将介绍如何在微信公众号实现积分商城功能。 一、了解积分商城 积分商城是…

邮件如何避免进垃圾箱

邮件营销是一种常见的营销手段,可以帮助企业向大量目标群体发送营销信息,因此邮件营销被广泛应用于促销活动、产品推广、新闻发布、客户维护等场景。然而随着垃圾邮件的泛滥,国内外大部分的电子邮件服务商都采取了越来越严厉的垃圾邮件过滤机…

系统集成|第九章(笔记)

目录 第九章 成本管理9.1 成本管理概念及相关术语9.2 主要过程9.2.1 制订成本管理计划9.2.2 成本估算9.2.3 成本预算9.2.4 成本控制 上篇:第八章、进度管理 第九章 成本管理 9.1 成本管理概念及相关术语 概述:项目成本管理就是要确保在批准的预算内完成…

怎么优化企业内部的报修流程?有什么好用的企业智能报修管理系统?

随着数字化转型成为企业的新风向,传统的企业报修方式已经变得不够便捷。传统的报修流程往往依赖于企业内部的组织架构,给员工和用户带来了许多麻烦。报修人需要注册、登录、下载和安装相关软件,而且一个故障报修还需要进行多个步骤的操作才能…

AI生成原创文章的工具-AI生成原创文字软件

让我们来了解一下AI生成原创文章的概念。这是指使用人工智能技术,特别是自然语言处理模型,来生成文字内容,这些文字看起来就像是由我们创作的。这种技术已经在自媒体、新闻媒体、博客和其他各种网站上广泛使用。但是,问题出现在于…

上位机在自动化控制中的作用和优势是什么?

上位机在自动化控制中的作用和优势是什么? 自动化控制编程领域包括单片机、PLC、机器视觉和运动控制等方向。输入“777”,即刻获取关于上位机开发和数据可视化的专业学习资料,近年来,上位机编程逐渐兴起,正在逐步替代…

数据结构与算法(五)--链表概念以及向链表添加元素

一、前言 今天我们学习另一种非常重要的线性数据结构–链表,之前我们已经学习了三种线性数据结构,分别是动态数组,栈和队列。其中队列我们额外学习了队列的另一种实现方式–循环队列。其实我们自己实现过前三个数据结构就知道,它…

什么是智能推荐?智能推荐的原理是什么?

一、智能推荐的魔力 2020年的愚人节晚间,罗永浩在抖音带货,相信你也被刷屏了吧。3小时的直播过程中,22款产品轮番出场,最终首播支付交易总额突破1.1亿、整场直播观看总人数超过4800万、总销售件数逾91万,粉丝打赏音浪…

MySQL数据库查缺补漏——基础篇

MySQL数据库查缺补漏-基础篇 基础篇 net start mysql80[服务名] net stop mysql80 create database pshdhx default charset utf8mb4; 为什么不使用utf8?因为其字符占用三个字节,有四个字节的字符,所有需要设置为utf8mb4; 数值类型&…

免费获取独立ChatGPT账户!!

GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域:1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言,都可以为你提供相关的代码示例。2、数据可视化…