向量机SVM原理理解和实战

目录

概念场景导入

点到超平面的距离公式

最大间隔的优化模型

硬间隔、软间隔和非线性 SVM

用 SVM 如何解决多分类问题

1. 一对多法

2. 一对一法

SVM主要原理和特点

原理

优点

缺点

支持向量机模型分类

SVM实战如何进行乳腺癌检测

数据集

字段含义

代码实现

参考文章


概念场景导入

支持向量机主要用于分类和回归任务。由于其在各种数据集上表现出的优异性能,迅速成为流行的机器学习工具之一。

桌子上依然放着红色、蓝色两种球,但是它们的摆放不规律,如下图 所示。如何用一根棍子把这两种颜色分开呢

如果在同一个平面上来看,红蓝两种颜色的球是很难分开的。那么 有没有一种方式,可以让它们自然地分开呢?

在这里,二维平面变成了三维空间。原来的曲线变成了一个平面。这个平面,我们就叫做超平 面。

图中的直线 B 更靠近蓝色球,但是在真实环境下,球再多一些的话,蓝色球可能就被 划分到了直线 B 的右侧,被认为是红色球。同样直线 A 更靠近红色球,在真实环境下,如果 红色球再多一些,也可能会被误认为是蓝色球。所以相比于直线 A 和直线 B,直线 C 的划分 更优,因为它的鲁棒性更强。

那怎样才能寻找到直线 C 这个更优的答案呢?这里,我们引入一个 SVM 特有的概念:分类间隔

实际上,我们的分类环境不是在二维平面中的,而是在多维空间中,这样直线 C 就变成了决策面 C。在保证决策面不变,且分类不产生错误的情况下,我们可以移动决策面 C,直到产生两个极限 的位置:如图中的决策面 A 和决策面 B。极限的位置是指,如果越过了这个位置,就会产生 分类错误。这样的话,两个极限位置 A 和 B 之间的分界线 C 就是最优决策面。极限位置到最优决策面 C 之间的距离,就是“分类间隔”,英文叫做 margin。


如果我们转动这个最优决策面,你会发现可能存在多个最优决策面,它们都能把数据集正确分 开,这些最优决策面的分类间隔可能是不同的,而那个拥有“最大间隔”(max margin)的 决策面就是 SVM 要找的最优解。

点到超平面的距离公式

在上面这个例子中,如果我们把红蓝两种颜色的球放到一个三维空间里,你发现决策面就变成 了一个平面。这里我们可以用线性函数来表示,如果在一维空间里就表示一个点,在二维空间 里表示一条直线,在三维空间中代表一个平面,当然空间维数还可以更多,这样我们给这个线 性函数起个名称叫做“超平面”。超平面的数学表达可以写成:

首先,我们定义某类样本集到超平面的距离是这个样本集合内的样本到超平面的最短距离。我 们用 di 代表点 xi 到超平面 wxi+b=0 的欧氏距离。因此我们要求 di 的最小值,用它来代表 这个样本到超平面的最短距离。di 可以用公式计算得出:

这个公式表示点 xi​ 到由 ωx+b=0  定义的超平面的距离 di​,其中 ω 是超平面的法向量,b 是偏置项,分子中的绝对值表示点到超平面的有向距离的绝对值,分母是法向量的范数(也就是长度),用于归一化距离。简而言之,这个公式计算了点到分隔分类的边界的垂直距离。 

最大间隔的优化模型

我们的目标就是找出所有分类间隔中最大的那个值对应的超平面。在数学上,这是一个凸优化 问题(凸优化就是关于求凸集中的凸函数最小化的问题,这里不具体展开)。通过凸优化问题,最后可以求出最优的 w 和 b,也就是我们想要找的最优超平面。中间求解的过程会用到 拉格朗日乘子,和 KKT(Karush-Kuhn-Tucker)条件。数学公式比较多,这里不进行展开。

硬间隔、软间隔和非线性 SVM

假如数据是完全的线性可分的,那么学习到的模型可以称为硬间隔支持向量机。换个说法,硬间隔指的就是完全分类准确,不能存在分类错误的情况软间隔,就是允许一定量的样本分类错误
我们知道,实际工作中的数据没有那么“干净”,或多或少都会存在一些噪点。所以线性可分 是个理想情况。这时,我们需要使用到软间隔 SVM(近似线性可分),比如下面这种情况:

另外还存在一种情况,就是非线性支持向量机。


比如下面的样本集就是个非线性的数据。图中的两类数据,分别分布为两个圆圈的形状。那么 这种情况下,不论是多高级的分类器,只要映射函数是线性的,就没法处理,SVM 也处理不了。这时,我们需要引入一个新的概念:核函数。它可以将样本从原始空间映射到一个更高维的特质空间中,使得样本在新的空间中线性可分。这样我们就可以使用原来的推导来进行计 算,只是所有的推导是在新的空间,而不是在原来的空间中进行。

 所以在非线性 SVM 中,核函数的选择就是影响 SVM 最大的变量。最常用的核函数有线性核、多项式核、高斯核、拉普拉斯核、sigmoid 核,或者是这些核函数的组合。这些函数的区 别在于映射方式的不同。通过这些核函数,我们就可以把样本空间投射到新的高维空间中。
当然软间隔和核函数的提出,都是为了方便我们对上面超平面公式中的 w* 和 b* 进行求解, 从而得到最大分类间隔的超平面。

用 SVM 如何解决多分类问题

SVM 本身是一个二值分类器,最初是为二分类问题设计的,也就是回答 Yes 或者是 No。而 实际上我们要解决的问题,可能是多分类的情况,比如对文本进行分类,或者对图像进行识别。

针对这种情况,我们可以将多个二分类器组合起来形成一个多分类器,常见的方法有“一对多 法”和“一对一法”两种。

1. 一对多法

假设我们要把物体分成 A、B、C、D 四种分类,那么我们可以先把其中的一类作为分类 1, 其他类统一归为分类 2。这样我们可以构造 4 种 SVM,分别为以下的情况:
(1)样本 A 作为正集,B,C,D 作为负集;
(2)样本 B 作为正集,A,C,D 作为负集;
(3)样本 C 作为正集,A,B,D 作为负集;
(4)样本 D 作为正集,A,B,C 作为负集。
这种方法,针对 K 个分类,需要训练 K 个分类器,分类速度较快,但训练速度较慢,因为每 个分类器都需要对全部样本进行训练,而且负样本数量远大于正样本数量,会造成样本不对称 的情况,而且当增加新的分类,比如第 K+1 类时,需要重新对分类器进行构造。


2. 一对一法

一对一法的初衷是想在训练的时候更加灵活。我们可以在任意两类样本之间构造一个 SVM, 这样针对 K 类的样本,就会有 C(k,2) 类分类器。

比如我们想要划分 A、B、C 三个类,可以构造 3 个分类器:
(1)分类器 1:A、B;
(2)分类器 2:A、C;
(3)分类器 3:B、C。

当对一个未知样本进行分类时,每一个分类器都会有一个分类结果,即为 1 票,最终得票最多 的类别就是整个未知样本的类别。
这样做的好处是,如果新增一类,不需要重新训练所有的 SVM,只需要训练和新增这一类样 本的分类器。而且这种方式在训练单个 SVM 模型的时候,训练速度快。
但这种方法的不足在于,分类器的个数与 K 的平方成正比,所以当 K 较大时,训练和测试的 时间会比较慢。

SVM主要原理和特点

原理

  1. 最大化边际:SVM的核心理念是寻找一个决策边界(在二维空间中是一条线,在更高维空间中是一个平面或超平面),这个边界能够最大程度地区分不同类别的数据点。SVM尝试最大化各类数据点到决策边界的最小距离,这个距离被称为“边际”。

  2. 支持向量:决策边界的确切位置由距离它最近的几个训练样本确定,这些样本被称为“支持向量”。SVM模型特别关注这些关键样本。

  3. 核技巧:对于非线性可分的数据,SVM使用所谓的“核技巧”将数据映射到更高维的空间,从而使得数据在新空间中线性可分。常见的核函数包括线性核、多项式核、径向基函数(RBF)核等。

优点

  • 有效性:在中小规模数据集上,尤其是在高维空间中,SVM通常能提供良好的性能。

  • 泛化能力强:通过合适的正则化,SVM能够很好地避免过拟合,具有较好的泛化能力。

  • 适用性广泛:通过选择合适的核函数,SVM可以用于解决各种类型的数据。

缺点

  • 规模限制:对于大规模数据集,SVM的训练时间可能会非常长。

  • 核选择和参数调整:核函数的选择和参数的调整需要专业知识,且对模型性能影响很大。

  • 解释性:与某些模型相比,SVM模型的解释性较差,尤其是在使用复杂核函数时。

另外,SVM有几种不同的分支模型,主要根据不同的应用场景和数据特性来划分。

支持向量机模型分类

其他分支可看这里~

  1. 线性SVM:这是最基础的SVM形式,用于处理线性可分的数据集。它寻找一个超平面来最大化两个类别之间的边界。

  2. 非线性SVM:当数据集不是线性可分的时,非线性SVM使用核技巧来映射数据到一个更高维的空间,以便找到一个能有效分隔数据的超平面。常见的核函数包括多项式核、径向基函数(RBF)核、和Sigmoid核。

  3. 支持向量回归(SVR):SVR是SVM的一种变体,用于解决回归问题。它尝试找到一个函数,这个函数在给定的误差范围内尽可能地接近训练集中的所有数据点。

  4. 排序算法经典模型RankSVM:RankSVM的目标是学习一个模型来预测出一种数据点的排列顺序,这种顺序通常是由一些标注的偏好或顺序决定的。比如,在信息检索中,一个查询的结果需要被排序,以便最相关的信息排在最前面。RankSVM试图通过学习数据点之间的相对顺序来实现这一点。RankSVM在搜索引擎的结果排序、推荐系统等领域有广泛的应用。

SVM实战如何进行乳腺癌检测

数据集

GitHub - cystanford/breast_cancer_data: 乳腺癌检测分类数据

字段含义

上面的表格中,mean 代表平均值,se 代表标准差,worst 代表最大值(3 个最大值的平均 值)。每张图像都计算了相应的特征,得出了这 30 个特征值(不包括 ID 字段和分类标识结果字段 diagnosis),实际上是 10 个特征值(radius、texture、perimeter、area、 smoothness、compactness、concavity、concave points、symmetry 和 fractal_dimension_mean)的 3 个维度,平均、标准差和最大值。这些特征值都保留了 4 位 数字。字段中没有缺失的值。在 569 个患者中,一共有 357 个是良性,212 个是恶性。

代码实现

# 加载数据集,你需要把数据放到目录中
data = pd.read_csv("./data.csv")
# 数据探索
# 因为数据集中列比较多,我们需要把dataframe中的列全部显示出来
pd.set_option('display.max_columns', None)
print(data.columns)
print(data.head(5))
print(data.describe())# 将特征字段分成3组
features_mean= list(data.columns[2:12])
features_se= list(data.columns[12:22])
features_worst=list(data.columns[22:32])
# 数据清洗
# ID列没有用,删除该列
data.drop("id",axis=1,inplace=True)
# 将B良性替换为0,M恶性替换为1
data['diagnosis']=data['diagnosis'].map({'M':1,'B':0})# 将肿瘤诊断结果可视化
sns.countplot(data['diagnosis'],label="Count")
plt.show()
# 用热力图呈现features_mean字段之间的相关性
corr = data[features_mean].corr()
plt.figure(figsize=(14,14))
# annot=True显示每个方格的数据
sns.heatmap(corr, annot=True)
plt.show()
运行结果
运行结果

热力图中对角线上的为单变量自身的相关系数是 1。颜色越浅代表相关性越大。所以你能看出 来 radius_mean、perimeter_mean 和 area_mean 相关性非常大,compactness_mean、 concavity_mean、concave_points_mean 这三个字段也是相关的,因此我们可以取其中的 一个作为代表。

特征选择的目的是降维,用少量的特征代表数据的特性,这样也可以增强分类器的泛化能力, 避免数据过拟合。

我们能看到 mean、se 和 worst 这三组特征是对同一组内容的不同度量方式,我们可以保留 mean 这组特征,在特征选择中忽略掉 se 和 worst。同时我们能看到 mean 这组特征中, radius_mean、perimeter_mean、area_mean 这三个属性相关性大

compactness_mean、daconcavity_mean、concave points_mean 这三个属性相关性大。 我们分别从这 2 类中选择 1 个属性作为代表,比如 radius_mean 和 compactness_mean。 这样我们就可以把原来的 10 个属性缩减为 6 个属性,代码如下:

# 特征选择
features_remain = ['radius_mean','texture_mean', 'smoothness_mean','compactness_mean','symmetry_mean', 'fractal_dimension_mean']# 抽取30%的数据作为测试集,其余作为训练集
train, test = train_test_split(data, test_size = 0.3)# in this our main data is splitted into train and test
# 抽取特征选择的数值作为训练和测试数据
train_X = train[features_remain]
train_y=train['diagnosis']
test_X= test[features_remain]
test_y =test['diagnosis']# 采用Z-Score规范化数据,保证每个特征维度的数据均值为0,方差为1
ss = StandardScaler()
train_X = ss.fit_transform(train_X)
test_X = ss.transform(test_X)# 创建SVM分类器
model = svm.SVC()
# 用训练集做训练
model.fit(train_X,train_y)
# 用测试集做预测
prediction=model.predict(test_X)
print('准确率: ', metrics.accuracy_score(test_y,prediction))

运行结果:

准确率:  0.9181286549707602

准确率大于90%,说明训练结果还不错

参考文章

一个超强算法模型,SVM !!

SVM Classifier Tutorial | Kaggle

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

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

相关文章

所有网站文本复制方法(知网、百度文库等)

实现文字复制自由 在肝学校结课论文是发现要用的论文文字都无法复制,所以想到了以前学到的一个方法,开始忘了,突然想起来,现在记录一下。 拿我现在肝的课程结课论文为例: 方法一 在谷歌浏览器的网址前面有一个列表一…

ES8生产实践——日志清洗过滤(vector方案)

前言 什么是vector 以下描述摘自官方文档:https://vector.dev/docs/about/what-is-vector/ Vector 是一个高性能的可观测性数据管道,可帮助企业控制其可观测性数据。收集、转换和路由所有日志、度量指标和跟踪数据,并将其提供给今天需要的任…

CSS新手入门笔记整理:CSS基本选择器

id属性 id属性具有唯一性&#xff0c;也就是说&#xff0c;在一个页面中相同的id只能出现一次。在不同的页面中&#xff0c;可以出现两个id相同的元素。 语法 <div id"text"> ...... </div> class属性 class&#xff0c;顾名思义&#xff0c;就是“类…

LeetCode.283移动零(双指针)

LeetCode.283移动零 1.问题描述2.解题思路3.代码 1.问题描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1…

(三) Windows 下 Sublime Text 3 配置Python环境和Anaconda代码提示

一&#xff1a;新建一个 Python3.7 编译环境。 1 Tools--Build System--New Build System... 修改前&#xff1a; 修改后&#xff1a; 内容&#xff1a; {"cmd":["C:\\Python\\Python37-32\\python.exe","-u","$file"],"file_r…

开通橱窗还能开抖店吗?怎么开通?一篇详解!

我是电商珠珠 开通商品橱窗之后还能开抖店吗&#xff1f;商品橱窗和抖音小店可以同时开吗&#xff1f; 一部分人最初的时候&#xff0c;都觉得直播带货很火&#xff0c;所以就自己去买粉丝或是发视频积攒粉丝&#xff0c;等粉丝够了发现&#xff0c;好像和当初想的不太一样&a…

关于反射、枚举以及Lambda表达式你了解多少呢?快来看看吧~

目录 1、反射 1.1、定义 1.2、用途 1.3、反射基本信息 1.4、反射相关的类【重点】 1.5、Class类&#xff08;反射机制的起源&#xff09; 1.6、Class类中相关的方法 1.7、获得Class对象的三种方式 1.8、反射的使用 1.9、反射的优点、缺点 2、枚举 2.1、背景及定义 …

ZGC 垃圾回收过程

ZGC&#xff08;Z Garbage Collector&#xff09;是Java平台上的一种垃圾收集器&#xff0c;它是由Oracle开发的&#xff0c;旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器&#xff0c;它主要针对具有大内存需求和低停顿时间要求的应用程序 ZGC的核心概念及…

基于STC12C5A60S2系列1T 8051单片按页写IIC总线器件24C02并显示在液晶显示器LCD1602上应用

基于STC12C5A60S2系列1T 8051单片机按页写IIC总线器件24C02并显示在液晶显示器LCD1602上应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍…

【brpc学习实践十】streaming log实战

实战实例 通常我们在服务还没正式起来时&#xff0c;会用brpc流式log打印&#xff0c;支持对日志输出到ostream对象中&#xff08;默认std)。同时会在服务初始化时配置LogSink&#xff0c;实现自己的log&#xff0c;这样后续都可以将输出重定向至自己的log. int init(int arg…

Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式

By: Ailson Jack Date: 2023.11.26 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/165.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

RocketMQ 安装部署及应用场景记录

文章目录 前言一、RocketMQ简介1.1 整体架构 二、RocketMQ安装部署2.1 RocketMQ 下载2.2 修改 JVM 参数2.3 启动 NameServer 和 Broker2.4 验证发送和接受消息2.5 停止 NameServer 和 Broker2.6 配置全局环境 三、RocketMQ应用场景3.1 异步处理3.2 应用解耦3.3 流量削峰 前言 …

7.前端--CSS-字体属性【2023.11.26】

CSS字体属性 CSS Fonts (字体)属性用于定义字体样式、粗细、大小、和字形。 1.文字样式 CSS 使用 font-style 属性设置文本的风格。 语法&#xff1a; p { font-style: normal; }属性&#xff1a; 2字体粗细 CSS 使用 font-weight 属性设置文本字体的粗细。 语法&#xff1a…

已知两个链表L1和L2分别表示两个集合,其中元素递增排列。请设计一个算法,用于求出L1与L2的交集,并存放在L1链表中

已知两个链表L1和L2分别表示两个集合&#xff0c;其中元素递增排列。请设计一个算法&#xff0c;用于求出L1与L2的交集&#xff0c;并存放在L1链表中。 代码思路&#xff1a; 我们创建一个辅助链表L3&#xff0c;用于存储L1和L2链表的交集&#xff0c;用s遍历L3各个元素 用p和…

Java | The last packet sent successfully to the server was xxx milliseconds ago

最近在部署代码后&#xff0c;后端总是会遇到这个问题&#xff0c;设备通道在访问数据库时经常会报错&#xff0c;在搜集大量资料后我以为是配置问题&#xff0c;首先要保证&#xff1a; &#xff08;1&#xff09;首先确定jdbc.url地址是正确的 &#xff08;2&#xf…

2024年天津天狮学院专升本食品质量与安全专业《分析化学》考纲

2024年天津天狮学院食品质量与安全专业高职升本入学考试《分析化学》考试大纲 一、考试性质 《分析化学》专业课程考试是天津天狮学院食品质量与安全专业高职升本入学考试 的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《…

2023年09月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 运行下面程序后,角色的x坐标值是?( ) A:100 B:90 C:110 D:120 答案:C 利用变量值作为条件,控制循环的次数。变量从0~10的过程中每次角色的x坐标都增加了10,当变量值为1…

Unity-链接MySql8.0

链接MySql8.0 1.准备dll 一、找到l18N相关的dll 这里给出一个参考地址 D:\Unity\2020.3.48f1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit在里面找到如下图的四个dll 二、下载数据库链接dll https://downloads.mysql.com/archives/c-net/在这里搜索历史版本(Archiv…

flask依据现有的库表快速生成flask实体类

flask依据现有的库表快速生成flask实体类 在实际开发过程中&#xff0c;flask的sqlalchemy对应的model类写起来重复性较强&#xff0c;如果表比较多会比较繁琐&#xff0c;这个时候可以使用 flask-sqlacodegen 来快速的生成model程序或者py文件&#xff0c;以下是简单的示例&a…

Echart力引导依赖关系布局图

Echarts ECharts&#xff08;Enterprise Charts&#xff09;Apache ECharts是百度开发的一款开源的 JavaScript 数据可视化库。它提供了丰富的图表和图形&#xff0c;适用于在 Web 应用程序中创建各种交互式和动态的数据可视化图表。ECharts支持各种图表类型&#xff0c;包括折…