Machine Learning机器学习之向量机(Support Vector Machine,SVM)

目录

前言

算法提出背景:

核心思想:

原理:

应用领域:

一、支持向量机分类(主要变体)

 二、构建常见的支持向量机模型

基于Python 中的 Scikit-learn 库构建线性支持向量机(SVM)

三、向量机应用案列(完整代码)

四、总结 

优点:

缺点:

优化方向:


博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有需要可以联系作者我哦!

🍅文末三连哦🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

前言

支持向量机(Support Vector Machine,SVM)是由Vladimir N. Vapnik等人于1990年提出的一种监督学习算法。它的核心思想通过在特征空间中找到一个最优的超平面来进行分类,使得两个类别的样本之间的间隔最大化。SVM 在分类、回归分析、异常检测等领域都有着广泛的应用。

算法提出背景:

支持向量机最初是为了解决二分类问题而提出的。其发展背景主要源于统计学习理论和凸优化理论的发展。在提出之初,SVM 主要用于处理线性可分的数据集,后来又发展出了核技巧(kernel trick),使其能够处理非线性分类问题。

核心思想:

SVM 的核心思想是找到一个最优的超平面,将不同类别的样本分隔开来,并且使得两个类别之间的间隔最大化。具体来说,SVM 算法的目标是找到一个决策边界(超平面),使得所有的样本点到这个边界的距离(即间隔)最大化。

原理:

  1. 间隔最大化: SVM 算法通过最大化分类边界与最近的训练样本点之间的间隔来实现分类。

  2. 支持向量: 在优化问题中,只有一部分训练样本点被称为支持向量,它们是离分类边界最近的样本点。

  3. 核技巧: SVM 使用核技巧来将线性分类扩展到非线性分类。核技巧是一种数学手段,可以在高维特征空间中进行计算,而不需要显式地计算高维空间中的特征向量。

支持向量机的原理的公式来描述:

对于二分类问题,给定一个训练数据集:

支持向量机的原理可以通过以下公式来描述:

对于二分类问题,给定一个训练数据集:

\{(\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), \ldots, (\mathbf{x}_n, y_n)\}, \quad y_i \in \{-1, 1\}

其中{x}_i是输入样本的特征向量,y_i 是对应的类别标签,取值为-1或 1。

我们的目标是找到一个超平面 w^T \mathbf{x} + b = 0,能够将两类样本分开,并且使得两个类别中距离超平面最近的样本点到超平面的距离最大。这个距离称为间隔(margin)。

应用领域:

  1. 分类问题: SVM 主要用于解决二分类问题,可以通过调整参数和选择合适的核函数来适应不同的数据特征。

  2. 回归分析: SVM 还可以应用于回归分析问题,称为支持向量回归(Support Vector Regression,SVR),通过最小化预测值与真实值之间的误差来拟合数据。

  3. 异常检测: SVM 还可以用于异常检测,通过找到与训练样本差异较大的数据点来识别异常。

一、支持向量机分类(主要变体)

向量机广泛应用于分类和回归分析的监督学习算法

在支持向量机算法中,主要有以下几种主要的变体:

  • 线性支持向量机(Linear SVM): 最基本的支持向量机形式,用于处理线性可分或近似线性可分的数据。通过构建一个最大间隔超平面来分隔两个类别。

  • 非线性支持向量机(Nonlinear SVM): 通过使用核技巧(kernel trick),将数据映射到高维空间中进行分类,从而处理非线性可分的数据。常用的核函数包括多项式核、高斯核(径向基函数核)等。

  • 支持向量回归(Support Vector Regression,SVR): SVM 不仅可以用于分类问题,还可以用于回归分析。支持向量回归尝试通过最大化边界以外数据点的容忍度来拟合数据。

  • 多类别支持向量机(Multiclass SVM): SVM 最初是针对二分类问题的,但可以通过一对一(One-vs-One)或一对其他(One-vs-Rest)的策略来处理多类别分类问题。

  • 增量式支持向量机(Incremental SVM): 增量式支持向量机允许在训练数据集发生变化时对模型进行增量式的更新,而无需重新训练整个模型。

  • 稀疏支持向量机(Sparse SVM): 稀疏支持向量机通过引入稀疏性约束,以减少模型中使用的支持向量的数量,从而降低模型的复杂度。

 二、构建常见的支持向量机模型

构建一个常见的支持向量机(SVM)网络通常涉及以下步骤:

  1. 数据准备: 准备用于训练和测试的数据集,包括特征和标签。确保数据集经过适当的预处理,如归一化、缺失值处理等。

  2. 模型选择: 选择合适的支持向量机模型,包括线性 SVM、非线性 SVM(使用核技巧)等,根据问题的性质选择合适的模型。

  3. 模型训练: 使用训练数据对支持向量机模型进行训练。训练过程主要包括优化超参数和拟合数据。

  4. 模型评估: 使用测试数据对训练好的模型进行评估,评估模型的性能指标如准确率、精确率、召回率、F1 值等。

  5. 模型调优: 根据评估结果调整模型的超参数或者进行特征选择等操作,进一步提高模型的性能。

基于Python 中的 Scikit-learn 库构建线性支持向量机(SVM)

# 导入必要的库
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score# 加载数据集(这里以鸢尾花数据集为例)
iris = datasets.load_iris()
X = iris.data
y = iris.target# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 特征标准化(对特征进行归一化处理)
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)# 初始化支持向量机模型
svm = SVC(kernel='linear', random_state=42)# 训练支持向量机模型
svm.fit(X_train, y_train)# 在测试集上进行预测
y_pred = svm.predict(X_test)# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

执行结果:精度为100%

三、向量机应用案列(完整代码)

基于支持向量机(SVM)可以用于图像分类任务,以下通过使用 SVM 对手写数字进行识别。

我们使用了 sklearn 中的手写数字数据集(Digits Dataset)。我们将数据集划分为训练集和测试集,并对特征进行了标准化处理。然后,我们初始化了一个支持向量机模型,并使用训练集对其进行训练。最后,在测试集上进行预测,并计算了模型的准确率。

需要注意的是选择了径向基函数核(RBF Kernel),这是一种常用的非线性核函数,适用于处理非线性分类问题,如图像分类。我们可以根据实际情况选组需要的函数核。

# 导入必要的库
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score# 加载手写数字数据集
digits = datasets.load_digits()# 获取特征和标签
X = digits.data
y = digits.target# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 特征标准化(对特征进行归一化处理)
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)# 初始化支持向量机模型
svm = SVC(kernel='rbf', random_state=42)# 训练支持向量机模型
svm.fit(X_train, y_train)# 在测试集上进行预测
y_pred = svm.predict(X_test)# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

执行结果:精度约为98% 

四、总结 

优点:

  1. 有效的高维空间处理能力: SVM 在高维空间中可以非常高效地进行分类,适用于数据维度较高的情况,如文本分类、图像分类等。

  2. 泛化能力强: SVM 的目标是最大化分类边界的间隔,因此具有较好的泛化能力,对于未见过的数据集也有较好的表现。

  3. 抗噪声能力强: SVM 使用间隔最大化的方法,对于噪声数据的影响较小,能够更好地处理不完全标记的数据。

  4. 可以处理非线性分类问题: 通过核技巧(kernel trick),SVM 可以很容易地将线性分类扩展到非线性分类,适用于复杂的数据分布。

  5. 无局部极小值问题: SVM 的优化问题是凸优化问题,不存在局部极小值,因此能够保证找到全局最优解。

缺点:

  1. 对大规模数据集计算量较大: 在大规模数据集上,SVM 的训练时间较长,且占用的内存较大,不适合处理大规模数据集。

  2. 参数调节和核选择不直观: SVM 的性能很大程度上依赖于选择合适的核函数和参数调节,这些参数的选择通常不太直观,需要经验和实验来确定。

  3. 不适合非平衡数据集: SVM 对非平衡数据集的处理能力相对较弱,需要额外的处理手段来解决非平衡分类问题。

优化方向:

  1. 增量学习: 研究如何将新的样本数据逐步融入到原有的 SVM 模型中,以实现在线学习和动态更新模型。

  2. 并行化和分布式处理: 针对大规模数据集,研究如何将 SVM 训练过程进行并行化和分布式处理,以提高训练效率。

  3. 自动化参数调节: 研究自动化调节 SVM 参数的方法,例如使用基于优化算法或者交叉验证的方法来选择合适的参数。

  4. 深度学习与 SVM 结合: 探索深度学习和 SVM 结合的方法,以利用深度学习的特征提取能力和 SVM 的优化能力。

  5. 多核函数选择: 研究不同数据集和问题情况下,选择合适的核函数的方法,以进一步提高 SVM 的性能。

🍅文末三连哦🍅感谢支持

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

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

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

相关文章

SQLite中的动态内存分配(五)

返回:SQLite—系列文章目录 上一篇:SQLite中的原子提交(四) 下一篇:SQLite使用的临时文件(二) ​概述 SQLite使用动态内存分配来获得 用于存储各种对象的内存 (例如&#xff1a…

Django开发复盘

一、URL 对于一个不会写正则表达式的蒟蒻来说,在urls.py中就只能傻傻的写死名字,但是即便这样,还会有很多相对路径和绝对路径的问题(相对ip端口的路径),因为我们网页中涉及到页面跳转,涉及到发送…

神经网络:梯度下降法更新模型参数

作者:CSDN _养乐多_ 在神经网络领域,梯度下降是一种核心的优化算法,本文将介绍神经网络中梯度下降法更新参数的公式,并通过实例演示其在模型训练中的应用。通过本博客,读者将能够更好地理解深度学习中的优化算法和损…

帆软报表在arm架构的linux

有朋友遇到一个问题在部署帆软报表时遇到报错。 问 我在 arm架构的linux服务器上部署帆软报表遇到了一个棘手的问题,你有空帮忙看下嘛。 我看后台日志报的错是 需要升级 gcc、libmawt.so ,是系统中缺少Tomcat需要的依赖库,你之前处理过类似…

超级会员卡积分收银系统源码:积分+收银+商城三合一小程序 带完整的安装代码包以及搭建教程

信息技术的迅猛发展,移动支付和线上购物已经成为现代人生活的常态。在这样的背景下,商家对于能够整合收银、积分管理和在线商城的综合性系统的需求日益强烈。下面,罗峰给大家分享一款超级会员卡积分收银系统源码,它集积分、收银、…

vector类(一)

文章目录 vector介绍和使用1.vector的介绍2.vector的使用2.1 vector的定义2.2 vector iterator的使用2.3 vector空间增长问题2.4 vector增删查改2.5 vector迭代器失效问题 3.vector 在OJ中的使用 vector介绍和使用 1.vector的介绍 vector是表示 可变大小数组的 序列容器。 就…

《数据结构学习笔记---第五篇》---链表OJ练习上

目录 CM11链表分割 OR36 链表的回文结构 160.相交链表 141&142环形链表 CM11链表分割 step1:思路分析 1.首先可以想到,我们可以将原链表的元素划分到两个新的链表之中,由于必须保持顺序,所以新链表我们要用尾插。 2.为了方便进行尾插我…

自动化与智能化并行:数字化运维体系助力企业腾飞

文章目录 文章目录 文章目录 一、引言二、数字化运维体系的核心要素三、构建数字化运维体系的策略四、数字化运维体系的实施与挑战主要内容读者对象 一、引言 随着信息技术的迅猛发展,数字化转型已成为企业提升竞争力、实现可持续发展的必由之路。在数字化转型的过…

JSP – 支持WORD上传的富文本编辑器

1.下载示例 https://gitee.com/xproer/zyoffice-tinymce5 2.引入组件 3.配置转换接口 效果 泽优Office文档转换服务(zyOffice) 功能:一键导入Word转HTML,不装控件,不装Office,任意平台兼容(Windows,macOS,Linux,安卓Android,苹果…

【GPU系列】选择最适合的 CUDA 版本以提高系统性能

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

nvm安装以后,node -v npm 等命令提示不是内部或外部命令

因为有vue2和vue3项目多种,所以为了适应各类版本node,使用nvm管理多种node版本,但是当我按教程安装nvm以后,nvm安装以后,node -v npm 等命令提示不是内部或外部命令 首先nvm官网网址:https://github.com/coreybutler/…

数据结构——栈(C语言版)

前言: 在学习完数据结构顺序表和链表之后,其实我们就可以做很多事情了,后面的栈和队列,其实就是对前面的顺序表和链表的灵活运用,今天我们就来学习一下栈的原理和应用。 准备工作:本人习惯将文件放在test.c…

[C++]深入解析:如何计算C++类或结构体的大小

目录 什么是内存对齐 类的成员的存储规则 怎么进行内存对齐(介绍规则与例子讲解) 什么是内存对齐 内存对齐是指将数据存储在内存中时,按照一定的规则让数据排列在规定的地址上,以提高数据访问的效率和速度。在C中,结…

鸿蒙OS开发问题:(ArkTS)【 RSA加解密,解决中文乱码等现象】

RSA加解密开始构建工具类就是举步维艰,官方文档虽然很全,但是还是有很多小瑕疵,在自己经过几天的时间,彻底解决了中文乱码的问题、分段加密的问题。 首先看官方示例代码(以RSA非对称加解密(多次调用doFinal实现分段&a…

TikTok养号怎么做?打破0播放的前提是做好这些

TikTok养号的重要性不必多少,不仅可以在创号初期保障账号安全,后期的账号流量也需要以前期养好账号为前提。下面就给大家分享如何养号的真实操作攻略! 一、为什么要养号 (1)提高系统推荐精准度 系统不了解新账户人设…

spring boot 生成PDF模板文件

1、主要目录 2、maven依赖 <!--工具类依赖--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.19</version></dependency><dependency><groupId>com.alibaba&l…

56. 合并区间(力扣LeetCode)

文章目录 56. 合并区间题目描述思路贪心算法方法一&#xff1a;直接在res中修改代码逻辑梳理&#xff1a; 方法二&#xff1a;在原数组中插入一个超出题目范围的数组代码逻辑梳理&#xff1a; 56. 合并区间 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单…

律甲法务OA平台:信鸥科技引领法律行业新篇章

随着信息技术的飞速发展&#xff0c;法律行业也迎来了数字化转型的重要时刻。在这个信息化、智能化的时代&#xff0c;如何运用科技手段提升法律服务的质量和效率&#xff0c;成为法律行业亟待解决的问题。信鸥科技&#xff0c;作为业界的佼佼者&#xff0c;凭借其深厚的技术积…

Kafka详细教程(一)

总体目录 1、什么是消息队列 消息队列&#xff0c;英文名&#xff1a;Message Queue&#xff0c;经常缩写为MQ。从字面上来理解&#xff0c;消息队列是一种用来存储消息的队列 。来看一下下面的代码 // 1.创建一个保存字符串的队列Queue<String> queue new LinkedList&…

使用patchelf解决vscode远程连接不支持低版本glibc的问题

使用patchelf解决vscode远程连接不支持低版本glibc的问题 目录 使用patchelf解决vscode远程连接不支持低版本glibc的问题1. 动态链接库下载2. 用 patchelf 修改 vscode-server 依赖的 glibc 版本 VScode 1.86 版本的 remote 要求 glibc 2.28 及以上&#xff0c;于是在各种旧版本…