首页 > 其他分享 >支持向量机SVM:从数学原理到实际应用

支持向量机SVM:从数学原理到实际应用

时间:2023-11-18 19:57:12浏览次数:35  
标签:SVM 模型 torch 例子 数学原理 向量 超平面

本篇文章全面深入地探讨了支持向量机(SVM)的各个方面,从基本概念、数学背景到Python和PyTorch的代码实现。文章还涵盖了SVM在文本分类、图像识别、生物信息学、金融预测等多个实际应用场景中的用法。

关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

file

一、引言

背景

支持向量机(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)可以表示为:

file

例子:在一个二分类问题中,你可能需要最小化(w) 的范数(即,优化模型的复杂度)的同时,确保所有的样本都被正确分类(或尽可能地接近这个目标)。拉格朗日乘子法正是解决这种问题的一种方法。

KKT条件

Karush-Kuhn-Tucker(KKT)条件是非线性规划问题中的一组必要条件,也用于SVM中的优化问题。它是拉格朗日乘子法的一种扩展,用于处理不等式约束。在SVM中,KKT条件主要用来检验一个给定的解是否是最优解。

例子:在SVM模型中,KKT条件能帮助我们验证找到的超平面是否是最大化间隔的超平面,从而确认模型的优越性。

核技巧(Kernel Trick)

核技巧是一种在高维空间中隐式计算数据点之间相似度的方法,而无需实际进行高维计算。这让SVM能够有效地解决非线性问题。常用的核函数包括线性核、多项式核、径向基核(RBF)等。

file

例子:如果你在一个文本分类任务中遇到了非线性可分的数据,使用核技巧可以在高维空间中找到一个能够将数据有效分开的决策边界。

双重问题和主问题(Dual and Primal Problems)

在SVM中,优化问题通常可以转换为其对偶问题,这样做的好处是对偶问题往往更容易求解,并且能更自然地引入核函数。双重问题与主问题通过所谓的对偶间隙(duality gap)联系在一起,而当对偶间隙为0时,双重问题的解即为主问题的解。

例子:在处理大规模数据集时,通过解决双重问题而不是主问题,可以大大减少计算复杂性和时间。


四、代码实现

在这一部分中,我们将使用Python和PyTorch库来实现一个基础的支持向量机(SVM)。我们会遵循以下几个主要步骤:

  1. 数据预处理:准备用于训练和测试的数据。
  2. 模型定义:定义SVM模型的架构。
  3. 优化器选择:选择合适的优化算法。
  4. 训练模型:使用训练数据来训练模型。
  5. 评估模型:使用测试数据来评估模型的性能。

数据预处理

首先,我们需要准备一些用于训练和测试的数据。为简单起见,我们使用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.weightself.bias 是模型的参数,它们在训练过程中会被优化。

优化器选择

我们将使用PyTorch的内置SGD(随机梯度下降)作为优化器。

# 实例化模型和优化器
model = LinearSVM()
optimizer = torch.optim.SGD([model.weight, model.bias], lr=0.01)

训练模型

下面的代码段展示了如何训练模型:

# 设置训练轮次和正则化参数C
epochs = 100
C = 0.1

for 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||^2
        loss += C * torch.norm(model.weight)**2
        
        loss.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产品研发负责人。
如有帮助,请多关注
TeahLead KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

标签:SVM,模型,torch,例子,数学原理,向量,超平面
From: https://www.cnblogs.com/xfuture/p/17840990.html

相关文章

  • 自然语言处理预训练——全局向量的词嵌入
    带全局语料统计的跳元模型   GloVe模型  从条件概率比值理解GloVe模型 总结诸如词-词共现计数的全局语料库统计可以来解释跳元模型。交叉熵损失可能不是衡量两种概率分布差异的好选择,特别是对于大型语料库。GloVe使用平方损失来拟合预先计算的全局语料库......
  • 支持向量机 SVM(Supported Vector Machine)笔记
    简单可视化对偶性:图片出自:【数之道25】机器学习必经之路-SVM支持向量机的数学精华......
  • 计算机图形:计算法向量
    目录一元向量值函数及其导数一元向量值函数概念一元值函数的导数空间曲线的切线和法平面曲面的切平面与法线示例:求椭球体表面法向量参考一元向量值函数及其导数一元向量值函数概念已知空间曲线Γ(大写的γ)参数方程:\[\tag{1}\begin{cases}x=\varphi(t),\\y=\psi(t),t\in[\al......
  • 向量求和
    #include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){ intn,i; chara[200],b[200]; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++){  scanf("%d",&a[i]); } for(i=0;i<n;i++){   sc......
  • 基于 Amazon EKS 搭建开源向量数据库 Milvus
    一、前言生成式AI(GenerativeAI)的火爆引发了广泛的关注,也彻底点燃了向量数据库(VectorDatabase)市场,众多的向量数据库产品开始真正出圈,走进大众的视野。根据 IDC的预测,到2025年,超过80%的业务数据将是非结构化的,以文本、图像、音频、视频或其他格式存储。而大规模存储和查......
  • 神经网络入门篇:详解向量化实现的解释(Justification for vectorized implementation)
    向量化实现的解释先对几个样本计算一下前向传播,看看有什么规律:公式1.16:\(z^{[1](1)}=W^{[1]}x^{(1)}+b^{[1]}\)\(z^{[1](2)}=W^{[1]}x^{(2)}+b^{[1]}\)\(z^{[1](3)}=W^{[1]}x^{(3)}+b^{[1]}\)这里,为了描述的简便,先忽略掉\(b^{[1]}\)后面将会看到利用Python的......
  • 探索向量数据库 | 重新定义数据存储与分析
          随着大模型带来的应用需求提升,最近以来多家海外知名向量数据库创业企业传出融资喜讯。随着AI时代的到来,向量数据库市场空间巨大,目前处于从0-1阶段,预测到2030年,全球向量数据库市场规模有望达到500亿美元,国内向量数据库市场规模有望超过600亿人民币。      今天......
  • Cocos Creator中的向量cc.Vec2和矩形cc.Rect
    前言在CocosCreator游戏开发中,经常需要使用向量和矩形,这篇文章我们来总结下其常见用法。一、Vec2二维向量 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。 1.`letv1:cc.Vec2=......
  • MySQL 人脸向量,欧几里得距离相似查询
    前言    如标题,就是通过提取的人脸特征向量,写一个欧几里得SQL语句,查询数据库里相似度排前TOP_K个的数据记录。做法虽然另类,业务层市面上有现成的面部检索API,技术层现在有向量数据库。        用MySQL关系型存储128维人脸向量,先是进行欧式距离计算就要......
  • 神经网络入门篇:详解多样本向量化(Vectorizing across multiple examples)
    多样本向量化与上篇博客相联系的来理解逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算。神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值。这种计算是所有的训练样本同时进行的,以下是实现它具体的步骤:图1.4.1上篇博客中得到的四个等式。它们......