SVM多分类算法 – 基于支持向量机的多类别分类【MATLAB】

最后更新于:2025-10-12 00:14:46

一、代码运行环境

  • MATLAB: 理论上MATLAB2016以上可以使用,推荐使用MATLAB2024a及更新版本。

二、程序介绍

程序文件结构
SVM_Multiclass_Classification/
├── demoSVMMultiClass.m          # 演示脚本
├── FunSVMMultiClass.m           # 核心函数
├── iris.csv                     # 鸢尾花数据集
├── 代码说明.txt                  # 代码说明文档
└── figure/                      # 结果图片文件夹
    ├── 图1_混淆矩阵.png
    ├── 图2_分类对比.png
    ├── 图3_性能指标.png
    └── 图4_数据分布.png
文件说明

1. demoSVMMultiClass.m

  • 说明:SVM多分类算法的演示脚本文件,是核心函数 FunSVMMultiClass 的测试文件,可以直接运行。
  • 功能:加载鸢尾花数据集,设置算法参数,调用核心函数进行多分类训练和测试,输出性能指标并生成可视化结果。
  • 运行结果:
图1:SVM多分类混淆矩阵
图1:SVM多分类混淆矩阵,展示了各类别的分类准确性,对角线元素表示正确分类的样本数
图2:真实类别与预测类别对比图
图2:真实类别与预测类别对比图,蓝色圆圈表示真实标签,红色叉号表示预测标签
图3:各类别性能指标对比
图3:各类别性能指标对比,包括精确率、召回率和F1分数
图4:数据分布散点图
图4:数据分布散点图(通过PCA降维到2维),不同颜色表示不同类别

命令行输出示例:

     数据加载完成!
     数据集大小:150个样本,4个特征

     ===== SVM多分类算法 =====
     训练集样本数: 105
     测试集样本数: 45
     类别数量: 3

     ===== 分类结果 =====
     测试集准确率: 100.00%
     精确率: 100.00%
     召回率: 100.00%
     F1分数: 100.00%

     各类别性能指标:
     类别 0: 精确率=100.00%, 召回率=100.00%, F1=100.00%
     类别 1: 精确率=100.00%, 召回率=100.00%, F1=100.00%
     类别 2: 精确率=100.00%, 召回率=100.00%, F1=100.00%

     所有图片已保存到figure文件夹
     演示完成!

2. FunSVMMultiClass.m

  • 说明:SVM多分类算法的核心函数,实现了完整的多类别分类流程。
  • 功能:
  • 支持多种核函数(线性核、RBF核、多项式核)
  • 采用One-vs-Rest(OvR)策略进行多分类
  • 自动数据标准化和训练集/测试集划分
  • 完整的性能评估(准确率、精确率、召回率、F1分数)
  • 生成5种可视化结果(混淆矩阵、分类对比、性能指标、数据分布、决策边界)
  • 所有图片自动保存到figure文件夹
  • 函数定义及参数解释:
     function [accuracy, recall, precision, F1, SVMModels, info] = FunSVMMultiClass(dataX, dataY, options)
     % SVM多分类算法 - 使用One-vs-Rest策略进行多类别分类
     % 
     % 输入参数: 
     %   dataX - 输入特征数据,N×M的矩阵,N为样本数,M为特征数
     %   dataY - 标签数据,N×1的向量,N为样本数
     %   options - 参数设置结构体,包含以下字段:
     %       divideRatio:训练集比例,默认0.7(70%训练,30%测试)
     %       kernelFunction:核函数类型,'linear'|'rbf'|'polynomial',默认'rbf'
     %       kernelScale:核尺度参数,默认'auto'
     %       boxConstraint:箱式约束(惩罚系数),默认1
     %       polynomialOrder:多项式核函数阶数,默认3
     %       standardize:是否标准化数据,true|false,默认true
     %       figflag:是否绘图,'on'|'off',默认'on'
     %       randomSeed:随机种子,默认123456
     % 
     % 输出参数: 
     %   accuracy - 测试集分类准确率
     %   recall - 召回率(各类别平均)
     %   precision - 精确率(各类别平均)
     %   F1 - F1分数(各类别平均)
     %   SVMModels - 训练好的SVM模型集合
     %   info - 包含训练数据、测试数据、预测结果等详细信息的结构体

3. iris.csv

  • 说明:经典的鸢尾花数据集,包含150个样本,4个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度),3个类别(Setosa、Versicolor、Virginica)。
  • 用途:作为演示数据,展示SVM多分类算法的效果。

4. 代码说明.txt

  • 说明:详细的代码使用说明文档,包含环境要求、快速开始指南、主要功能介绍和参数说明。

三、快速开始

1. 运行测试脚本

步骤:

1. 在MATLAB中打开下载好的 SVM_Multiclass_Classification 文件夹 2. 确保当前路径为该文件夹的根目录 3. 在命令行窗口输入并运行:

   demoSVMMultiClass

4. 程序运行完毕后,如果没有报错且正常绘制4张图像,则说明运行环境正常

判断程序是否正常运行:

  • 命令行窗口输出完整的性能指标信息
  • 自动弹出4个图形窗口,显示混淆矩阵、分类对比、性能指标和数据分布
  • figure文件夹中自动生成4张PNG图片
2. 修改仿真数据/导入数据
情况一:使用自己的仿真数据

1. 复制一个 demoSVMMultiClass.m 的文件副本(如 myDemo.m) 2. 在副本中修改数据导入部分(第9-15行):

   %% 1. 数据导入
   % 使用自己的数据替换
   X = your_feature_data;  % 替换为你的特征数据矩阵(N×M)
   Y = your_label_data;    % 替换为你的标签向量(N×1)

注意事项:

  • X 必须是数值型矩阵,每行为一个样本,每列为一个特征
  • Y 必须是向量,可以是数值型或categorical类型
  • 样本数N必须与标签数量一致
  • 特征数M建议在2-100之间,过多的特征可能需要特征选择或降维
情况二:使用真实采集的数据

从Excel文件导入:

% 方法1:使用readtable(推荐)
data = readtable('your_data.xlsx');
X = data{:, 1:end-1};  % 前面的列为特征
Y = data{:, end};       % 最后一列为标签

% 方法2:使用xlsread
[num, txt, raw] = xlsread('your_data.xlsx');
X = num(:, 1:end-1);
Y = num(:, end);

从CSV文件导入:

data = readtable('your_data.csv');
X = data{:, 1:end-1};
Y = data{:, end};

从TXT文件导入:

% 假设数据为空格或Tab分隔
data = load('your_data.txt');
X = data(:, 1:end-1);
Y = data(:, end);

如果没有测试标签: 如果你的数据没有分开的测试集标签,需要修改代码:

1. 删除或注释掉性能评估相关代码 2. 只关注模型训练和预测结果

3. 调整算法参数(可选)

demoSVMMultiClass.m 的第21-29行可以调整算法参数:

% 核函数选择
options.kernelFunction = 'rbf';      % 'linear':线性核,适合线性可分问题
                                     % 'rbf':径向基核,适合大部分非线性问题(推荐)
                                     % 'polynomial':多项式核,适合特定非线性问题

% 数据划分比例
options.divideRatio = 0.7;           % 0.7表示70%训练,30%测试
                                     % 可调整为0.6-0.8之间

% 惩罚系数(C参数)
options.boxConstraint = 1;           % 值越大,对误分类的惩罚越大
                                     % 建议范围:0.1-100

% 核尺度参数(gamma参数)
options.kernelScale = 'auto';        % 'auto':自动选择最优值(推荐)
                                     % 也可设置为具体数值,如0.1、1、10等

% 多项式核阶数(仅polynomial核函数需要)
options.polynomialOrder = 3;         % 建议范围:2-5

% 是否标准化数据
options.standardize = true;          % true:标准化(推荐),false:不标准化

% 是否绘图
options.figflag = 'on';              % 'on':绘制图形,'off':不绘图

% 随机种子
options.randomSeed = 123456;         % 设置固定值可保证结果可重复

参数调优建议:

1. 首先使用默认参数运行,观察结果 2. 如果准确率不理想,尝试调整核函数类型 3. 调整惩罚系数 boxConstraint,通常在[0.1, 1, 10, 100]中选择 4. 如果使用RBF核,可以尝试不同的 kernelScale

4. 运行程序

完成以上修改后,在MATLAB命令行窗口运行:

myDemo  % 或者你修改后的脚本名称

程序会自动完成数据加载、模型训练、预测和可视化等所有步骤。

四、关于完整版与公开版代码

> 代码分为完整版和公开版(试用版),以满足不同用户的需求。

功能完整版公开版
数据导入、参数设置
软件全部源码×
核心函数源码完整可见加密(.p文件)
数据样本数限制无限制最大100个样本
所有核函数支持
完整可视化功能
画图水印无水印有水印标识
视频教程×
技术支持提供技术支持无技术支持
代码注释详细注释部分注释

📥 五、获取公开版程序

SVM_Multiclass_MATLAB_试用版_V25wp9x4s

注:公开版代码需使用MATLAB2022a及以上版本。


💎 六、获取完整版程序

点击下面”立即支付“按钮,付款后获取完整版代码下载链接和售后联系方式~付款完成后刷新一下本页面即可看到下载链接。

(注意:支付跳转失败的话,请使用浏览器打开本页面)

您需要先支付 39元 才能查看此处内容!立即支付

七、完整版代码重要更新

  • 2025-01-10: 完成初版代码
  • 实现基于SVM的多分类算法
  • 支持多种核函数(线性、RBF、多项式)
  • 实现One-vs-Rest多分类策略
  • 提供完整的性能评估指标
  • 生成5种可视化结果
  • 自动保存图片到figure文件夹

八、常见问题

Q1: 运行程序时提示找不到文件?

A: 请确保:

1. 当前MATLAB工作路径为 SVM_Multiclass_Classification 文件夹 2. 所有文件(demoSVMMultiClass.m、FunSVMMultiClass.m、iris.csv)都在同一目录下

Q2: 图片无法正常显示或保存?

A:

1. 检查是否有创建 figure 文件夹的权限 2. 尝试手动创建 figure 文件夹 3. 检查 options.figflag 是否设置为 'on'

Q3: 准确率很低怎么办?

A: 可以尝试:

1. 更换核函数类型(尝试 ‘linear’、’rbf’、’polynomial’) 2. 调整惩罚系数 options.boxConstraint(尝试0.1、1、10、100) 3. 确保数据已标准化(options.standardize = true) 4. 增加训练集比例(如 options.divideRatio = 0.8) 5. 检查数据质量和标签是否正确

Q4: 如何保存训练好的模型?

A: 在程序运行后,使用MATLAB的 save 命令:

save('my_svm_models.mat', 'SVMModels', 'info');

加载模型:

load('my_svm_models.mat');
Q5: 如何用训练好的模型预测新数据?

A: 使用返回的 SVMModelsinfo 结构体:

% 假设 newData 是新的特征数据
if info.standardize
    newData_std = (newData - info.mu) ./ info.sigma;  % 使用训练时的均值和标准差
else
    newData_std = newData;
end

% 预测
predictions = predict(SVMModels, newData_std);
Q6: 程序运行时间过长?

A:

1. 减少样本数量 2. 减少特征维度(使用PCA等降维方法) 3. 使用线性核函数(速度最快) 4. 调小 boxConstraint

Q7: 如何引用本代码?

A: 如果在论文或报告中使用了本代码,建议注明:

代码来源:Mr.看海,SVM多分类算法MATLAB实现
网站:www.khsci.com/docs

*如有其他问题,欢迎访问 www.khsci.com/docs 获取更多帮助信息。*