【机器学习】支持向量机

article/2025/6/25 13:19:35

文章目录

  • 一、支持向量机简述
    • 1.概念
    • 2.基本概念
    • 3.算法介绍
    • 4.线性可分
    • 5.算法流程
  • 二、实验
    • 1.代码介绍
    • 2.模型流程
    • 3.实验结果
    • 4.实验小结

一、支持向量机简述

1.概念

支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面,可以将问题化为一个求解凸二次规划的问题。与逻辑回归和神经网络相比,支持向量机,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。

2.基本概念

超平面:超平面是SVM中用于分割不同类别数据的决策边界。在线性可分的情况下,SVM试图找到一个超平面,使得不同类别之间的间隔最大化。这个最大间隔确保了模型具有良好的泛化能力,即使面对未知数据也能做出准确的分类

支持向量:支持向量机的核心概念之一是支持向量。在SVM中,支持向量是指距离超平面最近的几个数据点,这些点正是最难分类的数据点,同时也是对决策边界最有影响力的点。如果这些支持向量发生变化,那么超平面的位置也会随之改变,从而影响整个模型的分类效果。

3.算法介绍

在线性可分时,在原空间寻找两类样本的最优分类超平面。在线性不可分时,加入松弛变量并通过使用非线性映射将低维度输入空间的样本映射到高维度空间使其变为线性可分,这样就可以在该特征空间中寻找最优分类超平面。

4.线性可分

对于一个数据集合可以画一条直线将两组数据点分开,这样的数据成为线性可分(linearly separable),如下图所示:
在这里插入图片描述
分割超平面:将上述数据集分隔开来的直线成为分隔超平面。对于二维平面来说,分隔超平面就是一条直线。对于三维及三维以上的数据来说,分隔数据的是个平面,称为超平面,也就是分类的决策边界。
间隔:点到分割面的距离,称为点相对于分割面的间隔。数据集所有点到分隔面的最小间隔的2倍,称为分类器或数据集的间隔。论文中提到的间隔多指这个间隔。SVM分类器就是要找最大的数据集间隔。
支持向量:离分隔超平面最近的那些点。
SVM所做的工作就是找这样个超平面,能够将两个不同类别的样本划分开来,但是这种平面是不唯一的,即可能存在无数个超平面都可以将两种样本分开。
Vapnik提出了一种方法,对每一种可能的超平面,我们将它进行平移,直到它与空间中的样本向量相交。我们称这两个向量为支持向量,之后我们计算支持向量到该超平面的距离d,分类效果最好的超平面应该使d最大。

5.算法流程

(1)收集数据

(2)准备数据:需要数值型数据

(3)分析数据:有助于可视化分割超平面

(4)训练算法:SVM的大部分时间都源自训练,该过程主要实现两个参数的调优

(5)测试算法

(6)使用算法:解决分类问题

二、实验

1.代码介绍

def process_email(email_contents):# 转换为小写email_contents = email_contents.lower()# 移除HTML标签、处理URLs、电子邮件地址等email_contents = re.sub(r'<[^<>]+>', ' ', email_contents)email_contents = re.sub(r'(http|https)://[^\s]*', 'httpaddr', email_contents)# ... 其他替换规则 ...# 分词处理words = re.split(r'[@$/#.-:&*+=\[\]?!(){},\'\">_<;% ]', email_contents)# 初始化单词索引列表word_indices = []# 读取词汇表并处理每个单词vocab_list = get_vocab_list()for word in words:# 移除非字母字符并检查单词长度word = re.sub(r'[^a-zA-Z0-9]', '', word)if len(word) < 1:continue# 获取单词在词汇表中的索引if word in vocab_list:word_indices.append(vocab_list[word])return word_indices

功能:将原始邮件文本转换为词汇表中的索引列表。
步骤:
转换为小写,移除 HTML 标签,替换 URL、邮箱地址等特殊格式
按非字母数字字符分割邮件内容
将每个单词映射到词汇表中的索引(如果存在)。

def email_features(word_indices):# 获取词汇表大小vocab_list = get_vocab_list()n = len(vocab_list)# 初始化特征向量x = np.zeros(n)# 设置对应索引的特征为1for idx in word_indices:x[idx-1] = 1  # 词汇表索引从1开始,特征向量索引从0开始return x

功能:将邮件的单词索引列表转换为特征向量(词袋模型)。
实现:
创建一个长度为词汇表大小的向量,每个位置表示一个单词。
如果某个单词在邮件中出现,则对应位置为 1,否则为 0。

def train_spam_classifier():# 加载训练数据data = sio.loadmat('spamTrain.mat')X = data['X']  # 特征矩阵 (4000, 1899)y = data['y'].ravel()  # 标签向量# 训练SVM分类器(线性核,C=0.1)clf = svm.SVC(C=0.1, kernel='linear')clf.fit(X, y)# 计算训练集准确率p = clf.predict(X)print(f'训练集准确率: {np.mean(p == y) * 100:.2f}%')return clfdef test_spam_classifier(clf):# 加载测试数据data = sio.loadmat('spamTest.mat')Xtest = data['Xtest']ytest = data['ytest'].ravel()# 计算测试集准确率p = clf.predict(Xtest)print(f'测试集准确率: {np.mean(p == ytest) * 100:.2f}%')

功能:使用 SVM 训练分类器并评估性能。
关键点:
数据格式:X 是 4000×1899 的矩阵(4000 封邮件,1899 个特征)。
SVM 参数:
C=0.1:控制正则化强度,较小的值减少过拟合。
kernel=‘linear’:线性核适合高维稀疏数据(如文本)。

def top_predictors(clf):# 获取词汇表和SVM权重vocab_list = get_vocab_list()weights = clf.coef_[0]# 获取权重排序后的索引(降序)indices = np.argsort(-weights)# 打印前15个预测能力最强的词汇print('\nTop predictors of spam:')for i in range(15):for word, idx in vocab_list.items():if idx == indices[i] + 1:print(f'{word:15} {weights[indices[i]]:.6f}')break

功能:找出对预测垃圾邮件贡献最大的词汇。
原理:
SVM 的线性权重表示每个特征(单词)对分类的重要性。
权重越大,该单词越可能指示邮件是垃圾邮件。

def classify_new_email(clf, email_filename):# 读取邮件内容并预处理with open(email_filename, 'r') as f:email_contents = f.read()# 预处理邮件 → 特征向量 → 预测word_indices = process_email(email_contents)x = email_features(word_indices)prediction = clf.predict(x.reshape(1, -1))print(f'\n处理邮件: {email_filename}')print(f'预测结果: {"垃圾邮件" if prediction[0] == 1 else "非垃圾邮件"}')

功能:对新邮件进行分类预测。
流程:
读取邮件文本。
通过 process_email 转换为单词索引。
通过 email_features 转换为特征向量。
使用训练好的 SVM 模型预测类别。

2.模型流程

1.数据准备:
vocab.txt:包含 1899 个常用单词的词汇表。
spamTrain.mat 和 spamTest.mat:预提取的特征矩阵和标签。
2.训练阶段:
加载训练数据 → 训练 SVM 模型 → 评估训练集准确率。
3.测试阶段:
加载测试数据 → 评估测试集准确率。
4.预测阶段:
对新邮件进行预处理 → 提取特征 → 预测类别。

3.实验结果

在这里插入图片描述
训练集准确率(99.83%)
在用于训练模型的数据集(spamTrain.mat 中提供的数据 )上,模型预测正确的样本数占总样本数的比例高达 99.83% 。这表明模型在学习训练数据的模式和规律方面表现极为出色,能够很好地对训练集中的垃圾邮件和非垃圾邮件进行区分。
测试集准确率(98.90%)
在未参与模型训练的测试数据集(spamTest.mat 中的数据 )上,模型预测正确的比例为 98.90% 。测试集准确率是衡量模型泛化能力的重要指标,说明模型在面对新的、未见过的数据时,也能较为准确地判断邮件是否为垃圾邮件。
与训练集准确率对比
测试集准确率略低于训练集准确率,但差距不大,这是比较理想的情况。一定程度的差距是正常的,因为训练集和测试集数据存在差异,只要差距不显著,就表明模型没有严重的过拟合问题,泛化性能良好。
Top predictors of spam
列出了对判断邮件是否为垃圾邮件贡献最大的词汇及其对应的权重。权重反映了该词汇在 SVM 模型决策过程中的重要性,权重越大,说明该词汇越倾向于指示邮件是垃圾邮件。
比如 “our” 权重为 0.500614 ,“click” 权重为 0.465916 ,意味着在模型看来,邮件中出现这些词时,更有可能是垃圾邮件。像 “click” 常出现在垃圾广告邮件诱导用户点击链接的场景中,“guarante”也常出现在虚假承诺的垃圾推销邮件里。
对新邮件的分类结果(emailSample1.txt )
预测结果:判断 emailSample1.txt 为非垃圾邮件 。这是模型基于对该邮件文本进行预处理、特征提取后,通过已训练的 SVM 分类器进行预测得到的结论。
重要词汇:列出了邮件中出现的部分重要词汇,这些词汇在模型判断过程中具有一定作用。虽然它们整体上没有让模型判定该邮件为垃圾邮件,但这些词汇的出现情况也是模型决策的依据之一 。

4.实验小结

本次实验运用 SVM 构建垃圾邮件分类器。训练集准确率达 99.83% ,测试集准确率为 98.90% ,模型展现出良好的学习与泛化能力。通过合理设置 SVM 参数,结合有效的文本预处理及特征提取,使其能精准捕捉垃圾邮件特征。
从关键预测词汇看,“click”“guarante” 等高频于垃圾邮件场景的词权重较高,为模型判断提供依据。对新邮件emailSample1.txt 的成功分类,验证了模型实际应用的有效性。但仍可在特征工程、参数调优上深入探索,进一步提升模型性能与适应性。


http://www.hkcw.cn/article/UbDDFseekv.shtml

相关文章

scale up 不能优化 TCP 聚合性能

scale up 作为一种系统扩展优化的方法&#xff0c;旨在提高系统组件的执行效率&#xff0c;比如替换更高性能的硬件或算法。是否可以此为依据优化 TCP 呢&#xff0c;例如通过多条路径聚合带宽实现吞吐优化(对&#xff0c;还是那个 MPTCP)&#xff0c;答案是否定的。 因为 TCP…

深度学习|pytorch基本运算-广播失效

【1】引言 前序文章中&#xff0c;已经学习了pytorch基本运算中的生成随机张量、生成多维张量&#xff0c;以及张量的变形、加减和广播运算。 今天的文章在之前学习的基础上&#xff0c;进一步探索。 前序文章链接为&#xff1a; 深度学习|pytorch基本运算-CSDN博客 【2】…

Asp.Net Core SignalR的分布式部署

文章目录 前言一、核心二、解决方案架构三、实现方案1.使用 Azure SignalR Service2.Redis Backplane(Redis 背板方案&#xff09;3.负载均衡配置粘性会话要求无粘性会话方案&#xff08;仅WebSockets&#xff09;完整部署示例&#xff08;Redis Docker&#xff09;性能优化技…

Linux环境搭建MCU开发环境

操作系统版本&#xff1a; ubuntu 22.04 文本编辑器&#xff1a; vscode 开发板&#xff1a; stm32f103c8t6 调试器&#xff1a; st-link 前言 步骤一&#xff1a; 安装交叉编译工具链 步骤二&#xff1a; 创建工程目录结构 步骤三&#xff1a; 调试…

VR/AR 视网膜级显示破局:10000PPI 如何终结颗粒感时代?

一、传统液晶 “纱窗效应”&#xff1a;VR 沉浸体验的最大绊脚石 当用户首次戴上 VR 头显时&#xff0c;眼前密密麻麻的像素网格往往打破沉浸感 —— 这正是传统液晶显示在近眼场景下的致命缺陷。受限于 500-600PPI 的像素密度&#xff0c;即使达到 4K 分辨率&#xff0c;等效到…

【教学类-36-10】20250531蝴蝶图案描边,最适合大小(一页1图1图、2图图案不同、2图图案相同对称)

背景说明: 之前做了动物头像扇子(描边20),并制作成一页一套图案对称两张 【教学类-36-09】20250526动物头像扇子的描边(通义万相)对称图40张,根据图片长宽,自动旋转图片,最大化图片-CSDN博客文章浏览阅读1k次,点赞37次,收藏6次。【教学类-36-09】20250526动物头像…

灌水论坛系统总体设计文档

一、实验题目 灌水论坛系统 二、实验目的 旨在通过一个相对完整且功能丰富的Web应用实例&#xff0c;全面地实践和巩固Web开发所需的各项核心技术和工程方法&#xff0c;从而提升其综合应用能力和解决实际开发问题的能力。它不仅仅是完成一个软件&#xff0c;更是一个学习、…

TK海外抢单源码/指定卡单

​ 抢单源码&#xff0c;有指定派单&#xff0c;打针&#xff0c;这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单&#xff0c;金额多少&#xff0c; 前后端开源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接静态 伪静…

印军高官为何指责83架光辉订单0交付 国产战机交付延迟

印度空军参谋长辛格在印度工业联合会举办的年度商业峰会上严厉批评本国的航空制造业,指出印度大型国防项目的落实没有如期进行,包括国产“光辉”战机在内的战斗机向空军交付均出现延迟。根据2021年与印度斯坦航空有限公司签订的价值4800亿卢比(约合404亿元人民币)的合同,印…

年轻人开始主动挂艾草了 老习俗焕发新活力

今年端午节当天,“年轻人开始主动挂艾草了”登上小红书APP热点榜首,截至晚上9点30分浏览量达到918万次。菜市场几块钱一把的野生艾草,在年轻人手中经过巧手改造,搭配菖蒲叶、玉簪叶、香樟果和铃铛,变成了身价百元的“祈福门挂”。如今,挂艾草不再只是简单的节庆习俗,而是…

Roguelike地牢:混沌系统与涌现式玩法设计

目录 Roguelike地牢:混沌系统与涌现式玩法设计引言第一章 地牢生成算法1.1 多级生成策略1.2 柏林噪声应用第二章 道具生态系统2.1 属性耦合模型2.2 道具稀有度系统第三章 敌人行为树3.1 自适应难度3.2 状态机设计第四章 永久死亡机制4.1 元进度系统4.2 遗产继承设计第五章 光照…

【数据集】基于累计分布函数匹配CDF Matching与多分辨率卡尔曼滤波MKF相结合的地表温度(2002-2020)

目录 数据概述一、输入数据二、生产流程与处理方法步骤一:生成被动微波LST数据(PMW LST)步骤二:CDF匹配提高高分辨率LST质量步骤三:多分辨率卡尔曼滤波(MKF)融合生成全时空覆盖LST三、模拟效果与实验结果四、生成空间完整全天候LST五、验证与精度评估数据下载下载方式1:…

探索Python中的Dask:高效处理大规模数据的利器

在当今数据驱动的时代&#xff0c;处理大规模数据集已成为许多领域的重要挑战。Python作为数据科学和机器学习领域的主流编程语言&#xff0c;虽然拥有NumPy和Pandas等强大的库&#xff0c;但在面对超出内存限制的大数据集时&#xff0c;这些工具往往显得力不从心。Dask作为一款…

DeepSeek 部署中的常见问题及解决方案

部署环境配置问题 硬件资源不足或兼容性问题可能导致部署失败。在部署前需要对计算资源进行全面评估&#xff1a; 硬件要求检查 CPU&#xff1a;至少4核处理器&#xff08;推荐8核以上&#xff09;&#xff0c;如Intel Xeon或AMD EPYC系列GPU&#xff08;如需&#xff09;&…

SpringBoot简单体验

1 Helloworld 打开&#xff1a;https://start.spring.io/ 选择maven配置。增加SpringWeb的依赖。 Generate之后解压&#xff0c;代码大致如下&#xff1a; hpDESKTOP-430500P:~/springboot2/demo$ tree ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── s…

[yolov11改进系列]基于yolov11引入大型分离卷积注意力模块LSKA减少计算复杂性和内存的python源码+训练源码

【LSKA介绍】 本文给大家带来一种超大核注意力机制的改进方法&#xff0c;尝试了多种改进方法。不仅速度快&#xff0c;而且还有不同程度的提升了精度&#xff01; 论文&#xff1a;《LSKA&#xff08;大可分离核注意力&#xff09;&#xff1a;重新思考CNN大核注意力设计》 h…

AI编程在BOSS项目的实践经验分享

前言 在人工智能技术革新浪潮的推动下&#xff0c;智能编程助手正以前所未有的速度重塑开发领域。这些基于AI的代码辅助工具通过智能提示生成、实时错误检测和自动化重构等功能&#xff0c;显著提升了软件工程的全流程效率。无论是初入行业的开发者还是资深程序员&#xff0c;…

菜鸟之路Day36一一Web开发综合案例(部门管理)

菜鸟之路Day36一一Web开发综合案例&#xff08;部门管理&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.5.28 文章目录 菜鸟之路Day36一一Web开发综合案例&#xff08;部门管理&#xff09;一.环境搭建二.开发规范三.部门管理3.1查询3.2删除3.3新增3.3修改根据id来…

一周学会Pandas2之Python数据处理与分析-Pandas2数据合并与对比-df.compare():差异高亮

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili df.compare()&#xff1a;差异高亮 df.compare() 是 pandas 中用于 高效比较两个 DataFrame 差异 的方法&#xff0…

uniapp安卓App自定义相机(身份证相机)

效果图&#xff1a; 实现思路&#xff1a; 本人也是第一次做app的自定义相机功能&#xff0c;找了相关文章后&#xff0c;发现uniapp自带的相机组件是不能实现在app中自定义相机的功能&#xff0c;因为不支持。按照前辈们的思路&#xff0c;是使用uniapp中的live-pusher直播组…