支持向量机SVM:从数学原理到实际应用
目录
- 一、引言
- 背景
- SVM算法的重要性
- 二、SVM基础
- 线性分类器简介
- 什么是支持向量?
- 超平面和决策边界
- SVM的目标函数
- 三、数学背景和优化
- 拉格朗日乘子法(Lagrange Multipliers)
- KKT条件
- 核技巧(Kernel Trick)
- 双重问题和主问题(Dual and Primal Problems)
- 四、代码实现
- 数据预处理
- 模型定义
- 优化器选择
- 训练模型
- 评估模型
- 五、实战应用
- 文本分类
- 图像识别
- 生物信息学
- 金融预测
- 客户细分
- 六、总结
本篇文章全面深入地探讨了支持向量机(SVM)的各个方面,从基本概念、数学背景到Python和PyTorch的代码实现。文章还涵盖了SVM在文本分类、图像识别、生物信息学、金融预测等多个实际应用场景中的用法。
关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

一、引言
背景
支持向量机(SVM, Support Vector Machines)是一种广泛应用于分类、回归、甚至是异常检测的监督学习算法。自从Vapnik和Chervonenkis在1995年首次提出,SVM算法就在机器学习领域赢得了巨大的声誉。这部分因为其基于几何和统计理论的坚实数学基础,也因为其在实际应用中展示出的出色性能。
例子:比如,在人脸识别或者文本分类问题上,SVM常常能够实现优于其他算法的准确性。
SVM算法的重要性
SVM通过寻找能够最大化两个类别间“间隔”的决策边界(或称为“超平面”)来工作,这使得其在高维空间中具有良好的泛化能力。
例子:在垃圾邮件分类问题中,可能有数十甚至数百个特征,SVM能有效地在这高维特征空间中找到最优决策边界。
二、SVM基础
线性分类器简介
支持向量机(SVM)属于线性分类器的一种,旨在通过一个决策边界将不同的数据点分开。在二维平面中,这个决策边界是一条直线;在三维空间中是一个平面,以此类推,在N维空间,这个决策边界被称为“超平面”。
例子: 在二维平面上有红色和蓝色的点,线性分类器(如SVM)会寻找一条直线,尽量使得红色点和蓝色点被分开。
什么是支持向量?
在SVM算法中,"支持向量"是指距离超平面最近的那些数据点。这些数据点被用于确定超平面的位置和方向,因为它们最有可能是分类错误的点。
例子: 在一个用于区分猫和狗的分类问题中,支持向量可能是一些极易被误分类的猫或狗的图片,例如长得像猫的狗或者长得像狗的猫。
超平面和决策边界
超平面是SVM用来进行数据分类的决策边界。在二维空间里,超平面就是一条直线;在三维空间里是一个平面,以此类推。数学上,一个N维的超平面可以表示为(Ax + By + … + Z = 0)的形式。
例子: 在一个文本分类问题中,你可能使用词频和其他文本特征作为维度,超平面就是在这个多维空间里划分不同类别(如垃圾邮件和非垃圾邮件)的决策边界。
SVM的目标函数
SVM的主要目标是找到一个能“最大化”支持向量到超平面距离的超平面。数学上,这被称为“最大化间隔”。目标函数通常是一个凸优化问题,可通过各种算法(如梯度下降、SMO算法等)求解。
例子: 在信用卡欺诈检测系统中,SVM的目标是找到一个能最大化“良性”交易和“欺诈”交易之间间隔的超平面,以便能更准确地分类新的交易记录。
三、数学背景和优化
拉格朗日乘子法(Lagrange Multipliers)
拉格朗日乘子法是一种用于求解约束优化问题的数学方法,特别适用于支持向量机(SVM)中的优化问题。基础形式的拉格朗日函数(Lagrangian Function)可以表示为:

例子:在一个二分类问题中,你可能需要最小化(w) 的范数(即,优化模型的复杂度)的同时,确保所有的样本都被正确分类(或尽可能地接近这个目标)。拉格朗日乘子法正是解决这种问题的一种方法。
KKT条件
Karush-Kuhn-Tucker(KKT)条件是非线性规划问题中的一组必要条件,也用于SVM中的优化问题。它是拉格朗日乘子法的一种扩展,用于处理不等式约束。在SVM中,KKT条件主要用来检验一个给定的解是否是最优解。
例子:在SVM模型中,KKT条件能帮助我们验证找到的超平面是否是最大化间隔的超平面,从而确认模型的优越性。
核技巧(Kernel Trick)
核技巧是一种在高维空间中隐式计算数据点之间相似度的方法,而无需实际进行高维计算。这让SVM能够有效地解决非线性问题。常用的核函数包括线性核、多项式核、径向基核(RBF)等。

例子:如果你在一个文本分类任务中遇到了非线性可分的数据,使用核技巧可以在高维空间中找到一个能够将数据有效分开的决策边界。
双重问题和主问题(Dual and Primal Problems)
在SVM中,优化问题通常可以转换为其对偶问题,这样做的好处是对偶问题往往更容易求解,并且能更自然地引入核函数。双重问题与主问题通过所谓的对偶间隙(duality gap)联系在一起,而当对偶间隙为0时,双重问题的解即为主问题的解。
例子:在处理大规模数据集时,通过解决双重问题而不是主问题,可以大大减少计算复杂性和时间。
四、代码实现
在这一部分中,我们将使用Python和PyTorch库来实现一个基础的支持向量机(SVM)。我们会遵循以下几个主要步骤:
- 数据预处理:准备用于训练和测试的数据。
- 模型定义:定义SVM模型的架构。
- 优化器选择:选择合适的优化算法。
- 训练模型:使用训练数据来训练模型。
- 评估模型:使用测试数据来评估模型的性能。
数据预处理
首先,我们需要准备一些用于训练和测试的数据。为简单起见,我们使用PyTorch内置的Tensor数据结构。
import torch# 创建训练数据和标签
X_train = torch.FloatTensor([[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3]])
y_train = torch.FloatTensor([1, 1, 1, -1, -1, -1])# 创建测试数据
X_test = torch.FloatTensor([[1, 0.5], [2, 0.5]])
例子:
X_train中的数据表示二维平面上的点,而y_train中的数据则代表这些点的标签。例如,点(1, 1)的标签是1,而点(2, 3)的标签是-1。
模型定义
下面我们定义SVM模型。在这里,我们使用线性核函数。
class LinearSVM(torch.nn.Module):def __init__(self):super(LinearSVM, self).__init__()self.weight = torch.nn.Parameter(torch.rand(2), requires_grad=True)self.bias = torch.nn.Parameter(torch.rand(1), requires_grad=True)def forward(self, x):return torch.matmul(x, self.weight) + self.bias
例子: 在这个例子中,我们定义了一个线性SVM模型。
self.weight和self.bias是模型的参数,它们在训练过程中会被优化。
优化器选择
我们将使用PyTorch的内置SGD(随机梯度下降)作为优化器。
# 实例化模型和优化器
model = LinearSVM()
optimizer = torch.optim.SGD([model.weight, model.bias], lr=0.01)
训练模型
下面的代码段展示了如何训练模型:
# 设置训练轮次和正则化参数C
epochs = 100
C = 0.1for epoch in range(epochs):for i, x in enumerate(X_train):y = y_train[i]optimizer.zero_grad()# 计算间隔损失 hinge loss: max(0, 1 - y*(wx + b))loss = torch.max(torch.tensor(0), 1 - y * model(x))# 添加正则化项: C * ||w||^2loss += C * torch.norm(model.weight)**2loss.backward()optimizer.step()
例子: 在这个例子中,我们使用了hinge loss作为损失函数,并添加了正则化项
C * ||w||^2以防止过拟合。
评估模型
最后,我们使用测试数据来评估模型的性能。
with torch.no_grad():for x in X_test:prediction = model(x)print(f"Prediction for {x} is: {prediction}")
例子: 输出的“Prediction”表示模型对测试数据点的分类预测。一个正数表示类别
1,一个负数表示类别-1。
五、实战应用
支持向量机(SVM)在各种实际应用场景中都有广泛的用途。
文本分类
在文本分类任务中,SVM可以用来自动地对文档或消息进行分类。例如,垃圾邮件过滤器可能使用SVM来识别垃圾邮件和正常邮件。
例子: 在一个新闻网站上,可以使用SVM模型来自动将新闻文章分为“政治”、“体育”、“娱乐”等不同的类别。
图像识别
SVM也被用于图像识别任务,如手写数字识别或面部识别。通过使用不同的核函数,SVM能够在高维空间中找到决策边界。
例子: 在安全监控系统中,SVM可以用于识别不同的人脸并进行身份验证。
生物信息学
在生物信息学领域,SVM用于识别基因序列模式,以及用于药物发现等多个方面。
例子: 在疾病诊断中,SVM可以用于分析基因表达数据,以识别是否存在特定疾病的风险。
金融预测
SVM在金融领域也有一系列应用,如用于预测股票价格的走势或者用于信用评分。
例子: 在信用卡欺诈检测中,SVM可以用于分析消费者的交易记录,并自动标识出可能的欺诈性交易。
客户细分
在市场分析中,SVM可以用于客户细分,通过分析客户的购买历史、地理位置等信息,来预测客户的未来行为。
例子: 在电子商务平台上,SVM模型可以用于预测哪些客户更有可能购买特定的产品。
六、总结
支持向量机(SVM)是一种强大而灵活的机器学习算法,具有广泛的应用场景和优秀的性能表现。从文本分类到图像识别,从生物信息学到金融预测,SVM都表现出其强大的泛化能力。在这篇文章中,我们不仅介绍了SVM的基本概念、数学背景和优化方法,还通过具体的Python和PyTorch代码实现了一个基础的SVM模型。此外,我们还探讨了SVM在多个实际应用场景中的用法。
虽然SVM被广泛应用于各种问题,但它并非“一把通吃”的工具。在高维空间和大数据集上,SVM模型可能会遇到计算复杂性和内存使用的问题。此时,适当的核函数选择、数据预处理和参数优化尤为重要。
值得注意的是,随着深度学习的兴起,一些更为复杂的模型(如神经网络)在某些特定任务上可能会表现得更好。然而,SVM因其解释性强、理论基础坚实而依然保有一席之地。实际上,在某些应用场景下,如小数据集或者对模型可解释性有高要求的情境,SVM可能是更好的选择。
关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
相关文章:
支持向量机SVM:从数学原理到实际应用
目录 一、引言背景SVM算法的重要性 二、SVM基础线性分类器简介什么是支持向量?超平面和决策边界SVM的目标函数 三、数学背景和优化拉格朗日乘子法(Lagrange Multipliers)KKT条件核技巧(Kernel Trick)双重问题和主问题&…...
【办公自动化】在Excel中按条件筛选数据并存入新的表(文末送书)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
第三章:最新版零基础学习 PYTHON 教程(第十一节 - Python 运算符—Python 中的any与all)
Any 和 All 是 python 中提供的两个内置函数,用于连续的与/或。Any如果任何一项为 True,则返回 true。如果为空或全部为 false,则返回 False。Any 可以被认为是对所提供的可迭代对象进行 OR 操作的序列。它会短路执行,即一旦知道结果就停止执行。 句法: any(iterable) 函…...
Pytorch单机多卡分布式训练
Pytorch单机多卡分布式训练 数据并行: DP和DDP 这两个都是pytorch下实现多GPU训练的库,DP是pytorch以前实现的库,现在官方更推荐使用DDP,即使是单机训练也比DP快。 DataParallel(DP) 只支持单进程多线程…...
asp.net coremvc+efcore增删改查
下面是一个使用 EF Core 在 ASP.NET Core MVC 中完成增删改查的示例: 创建一个新的 ASP.NET Core MVC 项目。 安装 EF Core 相关的 NuGet 包。在项目文件 (.csproj) 中添加以下依赖项: <ItemGroup><PackageReference Include"Microsoft…...
Java基础面试,什么是面向对象,谈谈你对面向对象的理解
前言 马上就要找工作了,从今天开始一天准备1~2道面试题,来打基础,就从Java基础开始吧。 什么是面向对象,谈谈你对面向对象的理解? 谈到面向对象,那就不得不谈到面向过程。面向过程更加注重的是完成一个任…...
Ubuntu系统初始设置
更换国内源 安装截图工具 安装中文输入法 安装QQ 参考: 安装双系统win10Ubuntu20.04LTS(详细到我自己都害怕) 引导方式磁盘分区方法UEFIGPTLegancyMBR 安装网络助手 sudo apt install net-tools 安装VS Code 使用从官网下载.deb安装包…...
焕新古文化传承之路,AI为古彝文识别赋能
目录 1 古彝文与古典保护 2 古文识别的挑战 2.1 西文与汉文OCR 2.2 古彝文识别难点 3 合合信息:古彝文保护新思路 3.1 图像矫正 3.2 图像增强 3.3 语义理解 3.4 工程技巧 4 总结 1 古彝文与古典保护 彝文指的是云南、贵州、四川等地的彝族人使用的文字&am…...
毛玻璃动画交互效果
效果展示 页面结构组成 从上述的效果展示页面结构来看,页面布局都是比较简单的,只是元素的动画交互比较麻烦。 第一个动画交互是两个圆相互交错来回运动。第二个动画交互是三角绕着圆进行 360 度旋转。 CSS 知识点 animationanimation-delay绝对定位…...
Audio2Face的工作原理
预加载一个3D数字人物模型(Digital Mark),该模型可以通过音频驱动进行面部动画。 用户上传音频文件作为输入。 将音频输入馈送到预训练的深度神经网络中。 Audio2Face加载预制的3d人头mesh 3D数字人物面部模型由大量顶点组成,每个顶点都有xyz坐标。 深度神经网络输入音频特征,…...
【面试题】2023前端面试真题之JS篇
前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 表妹一键制作自己的五星红旗国庆头像,超好看 世界上只有一种真正的英雄主义,那就是看清生活的真相之后,依然热爱生活。…...
Mysql 分布式序列算法
接上文 Mysql分库分表 1.分布式序列简介 在分布式系统下,怎么保证ID的生成满足以上需求? ShardingJDBC支持以上两种算法自动生成ID。这里,使用ShardingJDBC让主键ID以雪花算法进行生成,首先配置数据库,因为默认的注…...
Windows/Linux双系统卸载Ubuntu
参考:双系统下完全卸载ubuntu...
asp.net core mvc 视图组件viewComponents
ASP.NET Core MVC 视图组件(View Components)是一种可重用的 UI 组件,用于在视图中呈现某些特定的功能块,例如导航菜单、侧边栏、用户信息等。视图组件提供了一种将视图逻辑与控制器解耦的方式,使视图能够更加灵活、可…...
如何保持终身学习
文章目录 2.1. 了解你的大脑2.2 学习是对神经元网络的塑造2.3 大脑的一生 3.学习的心里基础3.1 固定思维与成长思维3.2 我们为什么要学习 4. 学习路径4.1 构建知识模块4.2 大脑是如何使用注意力的4.3 提高专注力4.4 放松一下,学的更好4.5 巩固你的学习痕迹4.6 被动学…...
【RV1103】RTL8723bs (SD卡形状模块)驱动开发
文章目录 前言硬件分析Luckfox Pico的SD卡接口硬件原理图LicheePi zero WiFiBT模块总结 正文Kernel WiFi驱动支持Kernel 设备树支持修改一:修改二: SDK全局配置支持 wifi全局编译脚本支持编译逻辑拷贝rtl8723bs的固件到文件系统的固定目录里面去 上电后手…...
LeetCode 周赛上分之旅 #49 再探内向基环树
⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…...
kubernetes-v1.23.3 部署 kafka_2.12-2.3.0
文章目录 [toc]构建 debian 基础镜像部署 zookeeper配置 namespace配置 gfs 的 endpoints配置 pv 和 pvc配置 configmap配置 service配置 statefulset 部署 kafka配置 configmap配置 service配置 statefulset 这里采用的部署方式如下: 使用自定义的 debian 镜像作为…...
位置编码器
目录 1、位置编码器的作用 2、代码演示 (1)、使用unsqueeze扩展维度 (2)、使用squeeze降维 (3)、显示张量维度 (4)、随机失活张量中的数值 3、定义位置编码器类,我…...
Lua多脚本执行
--全局变量 a 1 b "123"for i 1,2 doc "Holens" endprint(c) print("*************************************1")--本地变量(局部变量) for i 1,2 dolocal d "Holens2"print(d) end print(d)function F1( ..…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
