【机器学习】支持向量机(SVM)

一、概述

支持向量机(Support Vector Machine,简称SVM)是一种对数据进行二分类的广义线性分类器,是一种监督学习算法,其决策边界是对学习样本求解的最大边距超平面。

SVM使用铰链损失函数计算经验风险并在求解系统中加入了正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器 。

SVM可以通过核方法进行非线性分类,是常见的核学习方法之一。  

总结来说,SVM有三大核心,分别是最大边距超平面、对偶问题以及核方法

二、最大边距超平面

在讲解最大超平面之前,先讲一下什么是线性可分。

线性可分是分类问题中的一个基础概念,它指的是在特征空间中,存在一个超平面(在二维空间中为一条直线,三维空间中为一个平面,更高维度则为超平面),使得所有属于一个类别的样本点都位于该超平面的同一侧,而所有属于另一个类别的样本点都位于该超平面的另一侧。换句话说,存在一个线性函数(或超平面)可以将不同类别的样本完全分开。

考虑一个二维数据集,其中红色“×”表示第一类样本,蓝色“√”表示第二类样本。如果能在二维平面上找到一条直线将这两类样本完全分开,则称该数据集是线性可分的。

然而,对于线性可分的数据集,可能存在多个超平面都能将数据分开。为了找到最佳的超平面,我们引入了支持向量机(SVM)算法。SVM算法认为最佳的超平面应该满足以下条件:

1.完全可分性:能够将训练集中的不同类别样本完全分开。
2.稳健性:对训练集中的噪声和异常值具有较好的鲁棒性。
3.最大间隔:与样本数据之间的间隔达到最大。


这里的“间隔”是指两侧样本点到超平面的最短距离之和,通常简称为“边距”(Margin)。为了找到最大间隔的超平面,我们需要考虑距离超平面最近的那些样本点,即支持向量(Support Vectors)。这些支持向量决定了最大间隔超平面的位置。

在SVM中,我们试图最大化边距,即找到距离超平面最近的样本点到超平面的距离之和  margin = min(d1 + d2),并确保这个距离之和在所有可能的超平面中是最大的。这样的超平面就被称为最大边距超平面(Maximum Margin Hyperplane),也是我们在SVM算法中寻求的最佳超平面。通过求解一个优化问题,SVM可以找到这个最大边距超平面,并使用它来对新数据进行分类。

转化为数学公式为:

Max\left ( margin \right ) = Max\left ( min\left ( d1+d2 \right ) \right )

点到直线的距离d:点W(Xw,Yw)到直线AX+BY+C=0的距离等于:

假设样本集中存在一个超平面W^{T}x+b = 0,使得样本集线性可分,那么样本到样本超平面的距离d为:

图中可知,无论k 值取多少,都是在W^{T}x+b = 0移动k个单位,对超平面的W并不影响

这里令W^{T}x+b = 1可得:

但是最大边距超平面转换为数学优化问题还有一个前提,也就是这个超平面能否把样本正确地分类:

对于每个样本点\left ( x_{i},y_{i} \right ),其约束条件可以表示为 y_{i}(w\cdot x_{i}+b)\geq 1

最大化W范数分之一等价于等价于最小化1/2W范数的平方(凸优化):

最终优化结果可得:

三、对偶问题:

支持向量机(SVM)原问题是一个二次规划问题,其目标是最大化间隔,同时满足一些不等式约束条件。通过对原问题进行拉格朗日乘数法,我们可以得到对偶问题,即在满足约束条件的前提下最大化拉格朗日函数的值。这种变换使得问题更加易于求解,因为对偶问题往往具有更好的数学性质,如凸性和可分离性等。

从算法角度来看对偶问题引入可以有更多的好处:

  • 将原问题中的非线性分类问题转化为线性分类问题,从而可以通过线性分类的方法来解决。
  • 引入核函数,能够不用知晓具体的维度转换函数直接获得数据的高维度差异度
  • 对偶问题的解往往具有稀疏性,即只有少数几个支持向量对决策边界有贡献。这使得模型更加简洁、易于解释,并且减少了计算成本。

不带约束条件:

对于不带约束条件的优化问题,直接对目标函数求到取极值就可以了。

带等式约束条件:

对于存在等式约束条件,我们先使用拉格朗日乘数法将约束条件融入目标函数,有条件约束问题转化为无条件约束问题·进而求解。

带不等式约束条件:

对于带不等式约束条件,我们先寻找其满足KKT条件的点,以达到满足约束、线性相关,以及在最优解处的特性(等式约束与拉格朗日乘子的乘积为零)。因为KKT点通常为潜在最优解。

将上面原问题的最终优化结果转化为对偶问题(硬间隔)为:

四、软间隔:

在实际应用当中,由于某些数据分布的影响,我们很难找到一个可以将其线性可分的超平面,也就是很难将其正确地分类,所以,SVM引入了软间隔这一概念。软间隔允许在一定的范围内出现错误的样本点,即允许部分样本点不满足硬间隔的要求。具体来说,软间隔通过在目标函数中引入一个损失函数(如hinge损失)来实现,该函数可以度量分类错误的程度大小。在优化过程中,软间隔支持向量机会尽量最大化间隔,同时使分类错误的样本点尽可能少。这样,就可以在一定程度上平衡分类器的泛化能力和对噪声的鲁棒性。

在被错误的数据影响之后,我们仍然能通过支持向量机找到一个次优解,,不过需要允许有错误的点处于这个间隔之内,也就是说对于任何一个样本点不再是大于等于一而是放宽了距离限制

y_{i}(w\cdot x_{i}+b)\geq 1-\xi _{i}

\xi _{i}就是一个松弛变量。

在优化问题中我们也增加了一个惩罚项,其中\xi _{i}是一个大于等于零的数。

软间隔的优化问题根据拉格朗日乘数法构建其对偶问题的最终结果:

可以看到其结果跟硬间隔对偶问题的结果大致上是一样的,只是约束条件不相同。

五、核函数

核函数可以将输入数据从原始空间映射到一个更高维的特征空间,使得原始数据在新的特征空间中呈现线性可分的特性。这样,原本在原始空间中非线性可分的问题,在映射后的高维空间中就变得线性可分了,从而扩展了SVM的应用范围。

核函数的作用主要是解决线性不可分问题,并且避免了“维数灾难”,减少了计算量。它的一般形式为K(x,y),其中x和y是输入数据,K(x,y)表示x和y在特征空间上的内积。

在遇到非线性分类SVM问题时,以上目标方程在原维度下无解,这就要进行升维转换,也就是需要用到维度转换函数,然而维度转换函数是复杂的,所以我们可以直接使用核函数,因为核函数就等于维度转换函数的点积结果。所以我们就可以根据原维度的点积结果直接计算出新维度的点积结果

我们可以看到左边为软间隔对偶问题的优化结果,非线性支持向量机问题就是使用核函数代替点积结果从而求出问题的最优解。

六、支持向量机优缺点:

支持向量机 (SVMs) 可用于以下监督学习算法: 分类, 回归 和 异常检测.

支持向量机的优势在于:

  • 在高维空间中非常高效.
  • 即使在数据维度比样本数量大的情况下仍然有效.
  • 在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的.
  • 通用性: 不同的核函数 核函数 与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核.


支持向量机的缺点包括:

  • 如果特征数量比样本数量大得多,在选择核函数 核函数 时要避免过拟合, 而且正则化项是非常重要的.
  • 计算复杂度高,支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的. 所以在训练的过程中会非常耗时。

 下面使用一个简单的例子使用支持向量机给鸢尾花数据集做分类:

假设我们有一个关于鸢尾花(Iris)数据集的问题,我们想要根据花瓣的长度和宽度来预测花的种类。为了简化,我们只考虑Setosa和Versicolour两种花,并将问题转化为一个二分类问题。

数据加载:

from sklearn import datasets  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  # 加载Iris数据集  
iris = datasets.load_iris()  
# 仅保留Setosa和Versicolour的样本  
X = iris.data[(iris.target == 0) | (iris.target == 1)][:, :2]  # 仅使用花瓣长度和宽度  
y = (iris.target[(iris.target == 0) | (iris.target == 1)] == 0).astype(int)  # 将目标转换为0和1  # 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 特征缩放  
scaler = StandardScaler()  
X_train = scaler.fit_transform(X_train)  
X_test = scaler.transform(X_test)

使用SVM训练模型:

from sklearn import svm  # 创建SVM分类器对象  
clf = svm.SVC(kernel='linear', C=1.0, random_state=42)  # 训练模型  
clf.fit(X_train, y_train)

对模型进行预测和评估:

from sklearn.metrics import accuracy_score  # 预测测试集的结果  
y_pred = clf.predict(X_test)  # 计算准确率  
accuracy = accuracy_score(y_test, y_pred)  
print(f"Accuracy: {accuracy}")

七、总结:

支持向量机(SVM)的功能强大,通过不同类别的数据点以最大间隔的超平面来实现分类,适用性也很普遍,区分硬间隔与软间隔以及非线性支持向量机,硬间隔也就是数据点是线性可分的情况下优化出的结果,软间隔则是硬间隔的基础上多了几个混乱的数据点,根据计算这些混乱数据点的影响则是引入了松弛变量(我叫它损失函数),非线性支持向量则是当数据点无法进行分类时候将数据从原始空间映射到一个更高维的特征空间从而实现分类。
(以上为自学笔记,侵删。)

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

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

相关文章

什么叫USDT(泰达币)的前世今生!

一、引言 在数字货币的世界里,USDT(Tether USDT)以其独特的稳定机制,成为了连接传统金融市场与加密货币市场的桥梁。本文将带您了解USDT的诞生背景、发展历程、技术特点以及未来展望。 二、USDT的诞生背景 USDT是Tether公司推出…

关于 Spring 是什么

Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的…

gitlab 创建 ssh 和 token

文章目录 一、创建ssh key二、将密钥内容复制到gitlab三、创建token 一、创建ssh key 打开控制台cmd,执行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的邮箱 C:\Users\xx\.ssh 目录下会创建一个名为id_rsa.pub的文件,用记事本打开,并…

Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”

文章目录 前言背景问题描述解决方案总结 前言 在使用 Vue 3 开发项目时,遇到“找不到模块 ‘/components/xxx.vue’ 或其相应的类型声明”的错误是一个常见问题。这通常与 TypeScript 和模块解析相关的配置不当有关。本文将详细介绍如何解决此问题,确保…

XDebug配置极简教程,phpstorm实现http请求断点调试

写这篇的文章的初衷:网络上配置XDebug的文章有很多,XDebug也有官方的文档, PhpStorm也有官方的文档,为什么还要写那? 相信不少人,都有一种感觉,虽然教程很多,但是按教程走一遍,自己的确不能正常调试。 问题出在下面几个方面: 1. 对调试过程中,没有一定的认识,因此…

Pandas-中axis的用法

在Pandas中,min(axis)方法是计算DataFrame或Series中每行或每列的最小值的函数。该函数可以接受一个参数axis,用于指定计算最小值的方向。当axis0时,表示沿着行的方向计算最小值;当axis1时,表示沿着列的方向计算最小值…

【数据结构与算法 | 链表篇】力扣876

1. 力扣876 : 链表的中间节点 (1). 题 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表…

YOLOv10真正实时端到端目标检测(原理介绍+代码详见+结构框图)| YOLOv10如何训练自己的数据集(NEU-DET为案列)

💡💡💡本文主要内容:真正实时端到端目标检测(原理介绍代码详见结构框图)| YOLOv10如何训练自己的数据集(NEU-DET为案列) 博主简介 AI小怪兽,YOLO骨灰级玩家,1&#xff0…

QT截图程序,可多屏幕截图二,增加调整截图区域功能

上一篇QT截图程序,可多屏幕截图只是实现了最基本的截图功能,虽然能用但是缺点也有,没办法更改选中的区域,这在实际使用时不太方便。这篇增加了这个功能。先看看效果。 实现代码为: 头文件 #ifndef MASKWIDGET_H #de…

NTLite深度Windows系统镜像文件修改定制

计算机爱好者和技术宅的圈子里,NTLite是一个广受欢迎的名字,一款强大的Windows系统定制工具,允许用户对Windows安装镜像进行深度修改,从而打造出一个更加个性化、高效且精简的操作系统。无论是为了优化系统性能、移除不必要的组件,还是集成最新的更新和驱动,NTLite都能成…

2024 最新版 Navicat 17 下载与安装步骤及演示 (图文版)

Navicat 是一款专业的数据库管理工具,支持多种数据库类型,包括 MySQL、Oracle、SQL Server、PostgreSQL、MariaDB、Redis、MongoDB 和 SQLite。Navicat17包含的版本如下Navicat Premium 17, Navicat 17 for MySQL, Navicat 17 for Oracle, Navicat 17 fo…

React中 将UI 视为树

当 React 应用程序逐渐成形时,许多组件会出现嵌套。那么 React 是如何跟踪应用程序组件结构的? React 以及许多其他 UI 库,将 UI 建模为树。将应用程序视为树对于理解组件之间的关系以及调试性能和状态管理等未来将会遇到的一些概念非常有用。…

网络故障与排除(一)

一、Router-ID冲突导致OSPF路由环路 路由器收到相同Router-ID的两台设备发送的LSA,所以查看路由表看到的OSPF缺省路由信息就会不断变动。而当C1的缺省路由从C2中学到,C2的缺省路由又从C1中学到时,就形成了路由环路,因此出现路由不…

cocos creator 3.x 手搓背包拖拽装备

项目背景: 游戏背包 需要手动 拖拽游戏装备到 装备卡槽中,看了下网上资料很少。手搓了一个下午搞定,现在来记录下实现步骤; 功能拆分: 一个完整需求,我们一般会把它拆分成 几个小步骤分别造零件。等都造好了…

MGR集群模拟故障切换

说明: 1、MGR集群搭建起来,但不知道是否能进行启动切换,故要手动模拟故障并且验证 2、停止主库master服务,登录mysql查看MGR是否进行自动切换。 3、主库切换完成以后,手动将宕机的服务器添加到MGR集群中。 一、模拟故障…

【Unity AR开发插件】五、运行示例程序

专栏 本专栏将介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用。 链接: Unity开发AR系列 热更数据制作:制作热更数据-AR图片识别场景 插件简介 通过热更技术实现动态地加载AR场景,简化了AR开发流程,让用户可…

Java整合ELK实现日志收集 之 Elasticsearch、Logstash、Kibana

简介 Logstash:用于收集并处理日志,将日志信息存储到Elasticsearch里面 Elasticsearch:用于存储收集到的日志信息 Kibana:通过Web端的可视化界面来查看日志(数据可视化) Logstash 是免费且开放的服务器端数…

视频智能分析平台LntonAIServer视频监控管理平台裸土检测算法的重要性与应用

随着科技的飞速发展,人工智能技术在各个领域的应用越来越广泛。其中,LntonAIServer裸土检测算法作为一种先进的技术手段,已经在农业、环境保护等领域取得了显著的成果。本文将探讨LntonAIServer裸土检测算法的重要性及其在实际应用中的优势。…

鸿蒙应用模型:【Stage模型开发】概述

Stage模型开发概述 基本概念 下图展示了Stage模型中的基本概念。 图1 Stage模型概念图 [AbilityStage] 每个Entry类型或者Feature类型的HAP在运行期都有一个AbilityStage类实例,当HAP中的代码首次被加载到进程中的时候,系统会先创建AbilityStage实例…

【NumPy】全面解析subtract函数:高效数组减法指南

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…