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

支持向量机

  • 一、概述
    • 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 npx,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()]).TP = 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()]).TP = 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.mzph.cn/news/83309.shtml

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

相关文章

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall

Python-MSF/CS生成shellcode-上线 cs上线 1.生成shellcode-c或者python 2.打开pycharm工具,创建一个py文件,将原生态执行代码复制进去 shellcode执行代码: import ctypesfrom django.contrib.gis import ptr#cs#shellcodebytearray(b"生…

Java skill - 服务同时开始https和http端口

Java skill - 服务同时开始https和http端口 添加ssl配置代码开启http端口讲解大坑 添加ssl配置 在配置文件中添加配置 server:# ssl证书配置ssl:# 双向证书配置# 证书文件路径key-store: /opt/ops/cert/xes.p12# 证书密码key-store-password: 123456# 证书类型key-store-type…

IMX6ULL移植篇-Linux内核源码目录分析一

一. Linux内核源码目录 之前文章对 Linux内核源码的文件做了大体的了解,如下: IMX6ULL移植篇-Linux内核源码文件表_凌肖战的博客-CSDN博客 本文具体说明 Linux内核源码的一些重要文件含义。 二. Linux内核源码中重要文件分析 1. arch 目录 这个目录…

用了 TCP 协议,就一定不会丢包吗?

表面上我是个技术博主。 但没想到今天成了个情感博主。 我是没想到有一天,我会通过技术知识,来挽救粉丝即将破碎的感情。 掏心窝子的说。这件事情多少是沾点功德无量了。 事情是这样的。 最近就有个读者加了我的绿皮聊天软件,女生&#xff0c…

01强化学习的数学原理:大纲

01强化学习学习路线大纲 前言强化学习脉络图章节介绍Chapter 1:Basic ConceptsChapter 2:Bellman EquationChapter 3:Bellman Optimality EquationChapter 4:Value Iteration / Policy IterationChapter 5:Monte Carlo…

华为OD机试 - 靠谱的车 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

JOSEF约瑟 智能电流继电器KWJL-20/L KWLD26 零序孔径45mm 柜内导轨式安装

KWJL-20智能电流继电器 零序互感器: KWLD80 KWLD45 KWLD26 KWJL-20 一、产品概述 KWJL-20系列智能剩余电流继电器(以下简称继电器)适用于交流电压至660V或更高的TN、TT、和IT系统,频率为50Hz。通过零序电流互感器检测出超过…

qt qml RadioButton如何设置字体颜色,style提示找不到怎么办?

qt QML中设置RadioButton的字体颜色,可以使用RadioButton的label属性来设置文本的样式。下面是一个示例代码: import QtQuick 2.6 import QtQuick.Controls 2.2 import QtQuick.Controls 1.4 as Controls1_4 import QtQuick.Controls.Styles 1.4 import…

如何使用Python和Numpy实现简单的2D FDTD仿真:详细指南与完整代码示例

第一部分:引言及FDTD简介 引言: 计算机模拟在许多科学和工程领域中都得到了广泛应用。在电磁学领域,有许多不同的数值方法用于模拟波的传播和散射。其中最为知名和广泛使用的一种方法是有限差分时域方法(Finite Difference Time Domain, FDTD)。在这篇…

IOTE 2023国际物联网展直击:芯与物发布全新定位芯片,助力多领域智能化发展

IOTE 2023国际物联网展,作为全球物联网领域的盛会,于9月20日在中国深圳拉开帷幕。北斗星通集团应邀参展,旗下专业从事物联网、消费类GNSS芯片研发设计的芯与物公司也随其亮相本届盛会。 展会上,芯与物展示了一系列创新的GNSS定位…

消费盲返模式:一种让消费者和商家都受益的新型消费返利模式

消费盲返是一种新型的消费返利模式,它的核心思想是:消费者在平台购买商品后,可以获得后续一定数量的订单的部分利润作为奖励。这样,消费者不仅可以享受商品的优惠,还有可能赚取更多的钱。 这种模式对于平台和消费者都有…

【教程】AERMOD高斯稳态扩散模型

查看原文>>>基于AERMOD模型在大气环境影响评价中的实践应用 随着我国经济快速发展,我国面临着日益严重的大气污染问题。近年来,严重的大气污染问题已经明显影响国计民生,引起政府、学界和人们越来越多的关注。大气污染是工农业生产…

iOS蓝牙 Connection Parameters 关键参数说明

1. 先贴苹果文档 《 Accessory Design Guidelines for Apple Devices 》 2. 几个关键词 connection Event Interval 事件间隔,为1.25ms的倍数。可以简单理解为,是两个连接着的蓝牙设备发送“心跳包”的时间间隔; 范围是 6 ~ 3200,即 7.5…

Jmeter性能测试吞吐量控制器使用小结

吞吐量控制器(Throughput Controller)场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现.。 jmeter性能测试:2023最新的大厂jmeter性能测试全过程项目实战详解,悄悄收藏,后面就看不到…

Cortex-R52 深度分析总目录

之前对于R52写的比较随意,现在觉得对于这种内核还是需要系统性的总结一下。故先按照芯片手册分以下章节进行总结: Cortex-R52系统架构Armv8-R AArch32 程序员模型Armv8-R AArch32 异常处理Armv8-R AArch32 内核行为Armv8-R AArch32 多核行为Armv8-R AAr…

java专项练习(评分)

package 专题练习;import java.util.Scanner;public class marking_by_judges {//需求:在唱歌比赛中,有6名评委给选手打分,范围是[0,100]的整数.//选手最后得分为去掉最高分和最低分的平均分public static void main(String[] args) {//储存分数数组int[] score_six new int[6…

Pytorch史上最全torch全版本离线文件下载地址大全(9月最新)

以下为pytorch官网的全版本torch文件离线下载地址 torch全版本whl文件离线下载大全https://download.pytorch.org/whl/torch/其中的文件版本信息如下所示(部分版本信息,根据需要仔细寻找进行下载):

Redis 数据类型

1、String数据类型 1.1 概述 String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等 1.2 SET/GET/APPEND/STRLEN redis 127.0.0.1:6379> exists mykey …

Web(1) 搭建漏洞环境(metasploitable2靶场/DVWA靶场)

简述渗透测试的步骤; 前期交互阶段→情报搜集阶段→威胁建模阶段→漏洞分析阶段→渗透攻击阶段→后渗透攻击阶段→报告阶段 (2)配置好metasploitable2靶场,截图 下载metasploitable2,VMware打开.vmx文件,登录,登陆用…

React 全栈体系(五)

第三章:React 应用(基于 React 脚手架) 一、使用 create-react-app 创建 react 应用 1. react 脚手架 xxx 脚手架: 用来帮助程序员快速创建一个基于 xxx 库的模板项目 包含了所有需要的配置(语法检查、jsx 编译、devServer…)下载好了所有…