基于SVM的一对一(One-vs-One)多类分类系统
项目简介
本项目实现了一套基于支持向量机(SVM)的高效多类别分类系统,核心算法采用“一对一”(One-vs-One, OvO)策略。针对多分类问题,该系统通过构建多个二分类器来解决类别区分问题。每个分类器专门训练用于区分两个特定的类别,在预测阶段通过投票机制(Voting Mechanism)汇总所有二分类器的结果,以确定样本的最终归属。
该项目在MATLAB平台上开发,集成了数据生成、特征预处理、模型训练、投票预测、性能评估及结果可视化等全套流程,旨在展示OvO策略如何有效处理分类空间重叠及多分类任务。
功能特性
- 合成数据集生成:自动生成具有4个类别、2维特征的符合高斯分布的合成数据集,并包含随机噪声以模拟真实环境。
- OvO策略实现:针对k个类别,自动构建k(k-1)/2个SVM二分类器,有效降低单次训练的复杂度。
- 标准化预处理:实现Z-score特征标准化,确保训练集和测试集分布的一致性。
- 投票决策机制:基于所有二分类器的预测结果构建投票矩阵,通过多数表决确定最终分类。
- 全面评估与可视化:提供分类准确率统计、混淆矩阵热力图以及二维平面上的决策边界可视化。
系统要求
- MATLAB R2016b 或更高版本
- Statistics and Machine Learning Toolbox(用于
fitcsvm, predict, mvnrnd 等函数)
使用方法
- 确保MATLAB路径中包含本项目的脚本文件。
- 直接运行主函数。
- 程序将自动执行数据生成、模型训练及评估,并在运行结束后弹出可视化窗口展示分类结果。
- 控制台将输出训练进度、分类器构建情况以及最终的准确率统计。
核心功能与实现逻辑
本项目的主程序主要包含以下五个核心处理阶段:
1. 数据集生成与划分
程序首先通过
mvnrnd函数基于预设的均值中心和协方差矩阵,生成4个类别共600个样本(每类150个)的二维合成数据。
- 数据乱序:为了保证训练的随机性,对生成的数据集进行了全局乱序处理。
- 数据集划分:按照7:3的比例将数据划分为训练集(70%)和测试集(30%)。
2. 特征标准化 (Z-Score)
实现了特征缩放逻辑,采用Z-score标准化方法(减去均值,除以标准差)。
- 训练集:计算训练数据的均值和标准差并进行转换。
- 测试集:严格使用训练集的均值和标准差对测试数据进行转换,防止数据泄露,保证预测的客观性。
3. 一对一 (OvO) 模型构建
这是系统的核心部分。对于k=4个类别,程序构建了6个(即4×3/2)独立的SVM二分类器。
- 核函数:统一使用径向基函数(RBF)核,以处理非线性可分数据。
- 循环训练:通过双重嵌套循环遍历所有类别的唯一组合(例如类别1 vs 类别2,类别1 vs 类别3...)。
- 子集提取:在每次迭代中,仅提取当前两个标签对应的训练样本进行SVM训练。
- 模型存储:将训练好的SVM模型及其对应的两个类别标签存储在结构体数组中,供后续调用。
4. 预测与投票机制
预测阶段不依赖单一模型,而是采用集成投票法:
- 遍历预测:将测试集输入到每一个已训练的二分类器中。
- 投票矩阵:初始化一个大小为
[样本数 × 类别数]的投票矩阵。 - 累计票数:如果仅仅区分类别A和类别B的分类器判定样本属于A,则A在投票矩阵对应列的票数加1;反之则B加1。
- 最终判定:统计每个样本在所有类别上的得票总数,取票数最高的类别作为最终预测结果。代码使用
max函数处理,当出现平票时,默认取索引较小的类别。
5. 性能评估与可视化
程序最后通过图形化界面直观展示模型性能:
- 准确率计算:对比预测标签与真实标签,计算整体分类准确率。
- 决策边界绘制:通过构建密集的网格点(Meshgrid),对网格上的每个点执行上述OvO投票预测逻辑,并使用
contourf绘制出彩色的分类区域轮廓,清晰展示不同类别间的非线性边界。 - 样本分布图:在决策边界图上叠加显示训练集(圆圈)和测试集(方块)的散点分布。
- 混淆矩阵:计算并绘制混淆矩阵热力图,数值化展示各类别的分类正确数及误判情况。
关键算法说明
- RBF SVM:代码中通过配置
KernelFunction为rbf,使得分类器能够通过映射到高维空间来解决低维下的线性不可分问题。 - 投票矩阵法:相比于直接的逻辑判断,使用投票矩阵使得代码更具扩展性。无论有多少个类别,只需增加矩阵列数即可,无需修改核心逻辑。
- 特征缩放一致性:代码中特别封装了辅助函数来处理特征缩放,确保了在预测时,测试数据是基于训练数据的统计特性进行归一化的,这是机器学习工程中的标准最佳实践。