【支持向量机(SVM)】:相关概念及API使用

文章目录

  • 1 SVM相关概念
    • 1.1 SVM引入
      • 1.1.1 SVM思想
      • 1.1.2 SVM分类
      • 1.1.3 线性可分、线性和非线性的区分
    • 1.2 SVM概念
    • 1.3 支持向量概念
    • 1.4 软间隔和硬间隔
    • 1.5 惩罚系数C
    • 1.6 核函数
  • 2 SVM API使用
    • 2.1 LinearSVC API 说明
    • 2.2 鸢尾花数据集案例
    • 2.3 惩罚参数C的影响

1 SVM相关概念

1.1 SVM引入

1.1.1 SVM思想

看一个故事,故事是这样子的:

在很久以前的情人节,一位大侠要去救他的爱人,但魔鬼需要大侠先攻克他设置的防线,于是和他玩了一个游戏game。

魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。”
在这里插入图片描述

于是大侠这样放,干的不错?

在这里插入图片描述

然后魔鬼,又在桌上放了更多的球,似乎有一个球站错了阵营。

在这里插入图片描述

大侠苦思冥想似乎记得学过SVM技术,于是就采用SVM试试。

这里的 SVM就试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。
在这里插入图片描述

现在即使魔鬼放了更多的球,棍仍然是一个好的分界线。
在这里插入图片描述
​ 在SVM 工具箱中有另一个更加重要的 trick(招式) 。 魔鬼看到大侠已经学会了前面一个trick,于是魔鬼给了大侠一个新的挑战。
在这里插入图片描述
​ 现在,大侠没有棍可以很好帮他分开两种球了,现在怎么办呢?当然又想起了放大招—SVM。像所有武侠片中一样大侠桌子一拍,球飞到空中。然后,凭借大侠练就的轻功,大侠抓起一张纸,插到了两种球的中间。样本在二维空间线性不可分,二维空间总解决不掉,将样本映射到更高维的空间,需要采用核函数。

在这里插入图片描述

​ 现在,从魔鬼的角度看这些球,这些球看起来像是被一条曲线分开了。
在这里插入图片描述

最后,魔鬼被折服了

再之后,无聊的大人们,把这些球叫做 「data」 ,把棍子叫做 「classifier」 , 最大间隙trick 叫做 「optimization」 , 拍桌子叫做 「kernelling」 , 那张纸叫做 「hyperplane」。

概念:

  • 超平面:划分类别的边界
  • 类别之间的间隔:样本到超平面的距离
  • 支持向量:与超平面距离最近的向量(样本)
  • 核函数:将样本映射到更高维空间的函数

1.1.2 SVM分类

支持向量机的基本模型是定义在特征空间上的间隔最大的线性分类器。它是一种二分类的模型当采用了核技巧之后,支持向量机可以用于非线性分类。不同类型的支持向量机解决不同问题:

(1)线性可分支持向量机(硬间隔支持向量机):

当训练数据线性可分的时候,通过硬间隔最大化,学习得到一个线性可分支持向量机。在分类间隔中,没有划分错误的样本。

(2)线性支持向量机(软间隔支持向量机):

当训练数据近似线性可分时,通过软间隔最大化,学习一个线性支持向量机。在分类间隔中,允许一部分样本划分错误。

(3)非线性支持向量机:

当训练数据线性不可分的时候,通过使用核技巧以及软间隔最大化,学得一个非线性支持向量机。

1.1.3 线性可分、线性和非线性的区分

第一个图是线性可分,我们借助线性可分支持向量机完成分类。第二个图是不能完全线性可分,我们通过线性支持向量机解决。第三个图是完全线性不可分的,需要借助非线性支持向量机分类。

在这里插入图片描述
通过上述描述,我们抽象其中的蓝球和红球,并将两种颜色的球转化为二维平面上的点坐标,篮球映射为黑球,红球映射为白球。使用直线H1,H2和H3分类这两类颜色的球,图中的H1不能很好的区分黑球和白球,可以看到H2和H3都能很好的区分这两种颜色的球。

在这里插入图片描述

区分数据集:

  • H2和H3这样的直线一样可以区分两种颜色的球体有很多种条直线,虽然他们都能够很好的分类已经存在的黑球和白球,也就是我们之前讲到的训练集分类效果很好,训练误差为0。

  • 但是不能保证这些超平面在未知的实例上运行效果会很好,和上面魔鬼和大侠的例子一样,当魔鬼放置更多的黑球或白球的时候,我们提到的这些平面还能很好的让这些未知的球得到很好的分类吗?

  • 考虑泛化误差的影响。 根据在检验样本上的运行效果,分类器必须从这些分类超平面中选择一个来表示它的决策边界

  • 满足这个条件的很多,但是使得泛化误差最小的条件就是边际margin最大的情况。如左图的边际不及右边的边际margin大,我们选择右边的图作为边界最好的划分。因为 在有新的点出现的时候左边图的边际会错误分类一些点,而右侧就能很好的分类。
    在这里插入图片描述

1.2 SVM概念

SVM全称是supported vector machine(支持向量机),即寻找到一个超平面使样本分成两类,并且间隔最大。
在这里插入图片描述
超平面最大间隔
在这里插入图片描述

SVM学习的目的在于找到具有最大边缘的超平面。

原因:因为最大边缘超平面可以使得我们的训练误差很小的情况下,当有新数据的到来时也能使得测试误差达到最小。

1.3 支持向量概念

所有坐落在边际两边的超平面上的点被称作” 支持向量 (support vectors)"。

如下图,这两个特殊点是支撑我们构建最大边缘超平面的。这些点所在的边缘超平面上的点,称为支持向量。下图中红色的点对右图中的红色的直线或平面有支撑作用,这些点是关键点。而其点对最优超平面都没有影响。

在这里插入图片描述

1.4 软间隔和硬间隔

  • 硬间隔指的是让所有的样本都不在最大间隔之间,并位于正确的一边,这就是硬间隔。如果出现异常值、或者样本不能线性可分,此时硬间隔无法实现。
    在这里插入图片描述
    在这里插入图片描述
  • 软间隔指的是我们容忍一部分样本在最大间隔之内,甚至在错误的一边。相对来说,软间隔可以应用在一些线性不可分的场景。
    • 目标是尽可能在保持间隔宽阔和限制间隔违例之间找到良好的平衡。
    • 通过惩罚系数C来控制这个平衡:C值越小,则间隔越宽,但是间隔违例也会越多。
      在这里插入图片描述

1.5 惩罚系数C

在硬间隔的情况下,我们只考虑如何使得间隔达到最大。在软间隔的情况,我们即要考虑最大化间隔,也要考虑到那些限制间隔违例的样本带来的损失。

C越大说明, 违反限制间隔的样本点带来的损失就越大,就要减少这些样本的数量,所以间隔就要越小。

在这里插入图片描述

C越小说明, 违反限制间隔的样本点带来的损失就越小,可以适当增大间隔,以增加模型的泛化能力。

在这里插入图片描述

1.6 核函数

核函数将原始输入空间映射到新的特征空间,使得原本线性不可分的样本在核空间可分
在这里插入图片描述

2 SVM API使用

2.1 LinearSVC API 说明

class sklearn.svm.LinearSVC(C=1.0)

  • C:惩罚系数,类似于线性回归中的正则化系数

LinearSVC API的使用方式:

from sklearn.svm import LinearSVC
mysvc = LinearSVC(C=30)
mysvc.fit(X_standard, y)
print(mysvc.score(X_standard, y))

2.2 鸢尾花数据集案例

from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
from plot_util import plot_decision_boundary


# 1.加载数据
X,y=load_iris(return_X_y=True)

# print(y.shape)
# print(X.shape)

# 选择前0和1类的前两个特征
x = X[y<2,:2  ]
# 选择 0和1类
y = y[y<2]
# print(y.shape)

# 绘制原数据图像分布
plt.scatter(x[y==0,0],x[y==0,1],c='red')
plt.scatter(x[y==1,0],x[y==1,1],c='blue')
plt.show()

# 2.数据的预处理
# 进行数据标准化
transform = StandardScaler()
x_tran=transform.fit_transform(x)


# 3.模型训练
# 设置惩罚系数
model=LinearSVC(C=10)
model.fit(x_tran,y)
y_pred = model.predict(x_tran)

print(accuracy_score(y_pred,y))

# 4.可视化
plot_decision_boundary(model,axis=[-3,3,-3,3])
plt.scatter(x_tran[y==0,0],x_tran[y==0,1],c='red')
plt.scatter(x_tran[y==1,0],x_tran[y==1,1],c='blue')
plt.show()

鸢尾花数据展示
在这里插入图片描述
LinearSVC分类边界
在这里插入图片描述

2.3 惩罚参数C的影响

from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
from plot_util import plot_decision_boundary,plot_decision_boundary_svc


# 1.加载数据
X,y=load_iris(return_X_y=True)

# print(y.shape)
# print(X.shape)
x = X[y<2,:2]
y = y[y<2]
# print(y.shape)

plt.scatter(x[y==0,0],x[y==0,1],c='red')
plt.scatter(x[y==1,0],x[y==1,1],c='blue')
plt.show()

# 2.数据的预处理
transform = StandardScaler()
x_tran=transform.fit_transform(x)


# 3.模型训练
model=LinearSVC(C=30)
model.fit(x_tran,y)
y_pred = model.predict(x_tran)

print(accuracy_score(y_pred,y))

# 4.可视化
plot_decision_boundary_svc(model,axis=[-3,3,-3,3])
plt.scatter(x_tran[y==0,0],x_tran[y==0,1],c='red')
plt.scatter(x_tran[y==1,0],x_tran[y==1,1],c='blue')
plt.show()


# 3.模型训练
model=LinearSVC(C=0.01)
model.fit(x_tran,y)
y_pred = model.predict(x_tran)

print(accuracy_score(y_pred,y))

# 4.可视化
plot_decision_boundary_svc(model,axis=[-3,3,-3,3])
plt.scatter(x_tran[y==0,0],x_tran[y==0,1],c='red')
plt.scatter(x_tran[y==1,0],x_tran[y==1,1],c='blue')
plt.show()

C = 0.01
在这里插入图片描述
C = 10
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git 基础之 merge 和 rebase 的比较

在团队软件开发过程中&#xff0c;代码合并是一个基本且频繁执行的任务。 Git 提供了多种合并代码的策略&#xff0c;其中最常用的是 merge 和 rebase。 尽管二者的终极目标是相同的——整合代码变更——它们的方法和推荐的使用场景却有所区别。本文将详细介绍和比较这两种策…

sagemaker中使用pytorch框架的DLC训练和部署cifar图像分类任务

参考资料 https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-python-sdk/pytorch_cnn_cifar10/pytorch_local_mode_cifar10.ipynbhttps://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html 获取训练数据 # s3://zhaojiew-sa…

jmeter常用配置元件介绍总结之配置元件

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

vite+vue3+ts编译vue组件后,编译产物中d.ts文件为空

一、前言 使用vue3vitets实现一个UI组件库&#xff0c;为了生成类型文件便于其他项目引用该组件库。根据推荐使用了vite-plugin-dts插件进行ts文件的生成 二、版本 组件版本vue ^3.5.12 vite ^5.4.10 vite-plugin-dts ^4.3.0 typescript ~5.6.2 三、问题描述 使用vitevi…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定&#xff1a;实现两种模态数据融合_红外相机标定-CSDN博客 &#xff0c;介绍了如何利用标定板实现外参标定&#xff1b;但实测下来发现2个问题&#xff1a; &#xff08;1&#xff09;红外标定板尺寸问题&#xff0c;由于标定板小…

柔性仿人手指全覆盖磁皮肤,具备接触觉和运动觉的双模态感知能力

人体精细触觉和本体运动觉依赖于相同类型的感受器&#xff0c;这些感受器位于肌肉、肌腱、关节和皮肤中&#xff0c;负责感知轻触、挠痒、细微压力、形状变化、肌肉张力、肌腱拉伸和关节位置变化等信息。因此方斌教授团队着手于具有高精度、小尺寸、可定制等优势的磁触觉传感器…

【摘要】正点原子--Makefile--学习笔记

目录 一、Makefile 基础1、Makefile引入2、Makefile初次编写 二、Makefile语法1、Makefile规则格式2、Makefile第一次升级 一、Makefile 基础 1、Makefile引入 2、Makefile初次编写 二、Makefile语法 1、Makefile规则格式 2、Makefile第一次升级

【WPF】Prism学习(八)

Prism Dependency Injection 1.处理解析错误 1.1. 处理解析错误&#xff1a; 这个特性是在Prism 8中引入的&#xff0c;如果你的应用目标是早期版本&#xff0c;则不适用。 1.2. 异常发生的原因&#xff1a; 开发者可能会遇到多种原因导致的异常&#xff0c;常见的错误包括…

第8章硬件维护-8.2 可维护性和可靠性验收

8.2 可维护性和可靠性验收 可维护性和可靠性验收非常重要&#xff0c;硬件维护工程师在后端发现问题后&#xff0c;总结成可维护性和可靠性需求&#xff0c;在产品立项的时候与新特性一起进行需求分析&#xff0c;然后经过设计、开发和测试环节&#xff0c;在产品中落地。这些需…

Java 岗面试八股文及答案整理(2024最新版)

春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们 Java 程序员的面试之路&#xff0c;是挺难的&#xff0c;过了 HR&#xff0c;还得被技术面&#xff0c;小刀在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终侥幸能…

sglang 部署Qwen2VL7B,大模型部署,速度测试,深度学习

sglang 项目github仓库&#xff1a; https://github.com/sgl-project/sglang 项目说明书&#xff1a; https://sgl-project.github.io/start/install.html 资讯&#xff1a; https://github.com/sgl-project/sgl-learning-materials?tabreadme-ov-file#the-first-sglang…

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之&#xff1a;Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…

Java项目实战II基于微信小程序的科创微应用平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着科技的…

C++ Primer习题集----题目+答案版

具体源码请见&#xff1a;Cprimer习题上半部分资源-CSDN文库 目录 第一章 开始 练习1.1 编写程序&#xff0c;在标准输出上打印Hello.world 练习1.2 我们的程序使用加法运算符来将两个数相加。编写程序使用乘法运算符*&#xff0c;来打印两个数的积。 练习1.4 编译一个包…

Zookeeper的简单使用Centos环境下

目录 前言 一、ZOokeeper是什么&#xff1f; 二、安装Zookeeper 1.进入官网下载 2.解压到服务器 3.配置文件 三.使用Zookeeper 3.1启动相关指令 3.2其他指令 3.3ACL权限 总结 前言 记录下安装zookeeper的一次经历 一、ZOokeeper是什么&#xff1f; ZooKeeper是一…

【Linux】————多线程(概念及控制)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年11月19日 再谈地址空间&#xff1a; OS对内存进行管理不是根据字节为单位&#xff0c;以字节为单位效率过低&#xff0c;是以内存块为单位的&#xff0c;一个内存块的大小一般为4…

蓝桥杯每日真题 - 第17天

题目&#xff1a;&#xff08;最大数字&#xff09; 题目描述&#xff08;13届 C&C B组D题&#xff09; 题目分析&#xff1a; 操作规则&#xff1a; 1号操作&#xff1a;将数字加1&#xff08;如果该数字为9&#xff0c;变为0&#xff09;。 2号操作&#xff1a;将数字…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

SIMCom芯讯通A7680C在线升级:FTP升级成功;http升级腾讯云对象储存的文件失败;http升级私有服务器的文件成功

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

前端访问后端实现跨域

背景&#xff1a;前端在抖音里做了一个插件然后访问我们的后端。显然在抖音访问其他域名肯定会跨域。 解决办法&#xff1a; 1、使用比较简单的jsonp JSONP 优点&#xff1a;JSONP 是通过动态创建 <script> 标签的方式加载外部数据&#xff0c;属于跨域数据请求的一种…