基于粒子群优化算法的 SVM 分类预测系统
项目简介
本项目不仅仅是一个标准的 SVM 分类器,而是一个集成了
粒子群优化算法 (PSO) 的高精度分类预测系统。针对支持向量机(SVM)在处理非线性问题时参数选择困难(特别是惩罚因子 C 和核函数参数 Gamma)的问题,本项目通过 PSO 算法在参数空间内进行全局寻优。
系统的核心逻辑旨在通过迭代搜索找到使模型泛化能力最强的参数组合,从而构建具有高精度的分类模型。虽然代码中为了便于演示内置了非线性分布的模拟数据集(同心圆数据),但其架构设计通用,可用于故障诊断、医学诊断等多种二分类模式识别任务。
功能特性
- 自动参数寻优:利用 PSO 算法自动搜索 SVM 的最优惩罚因子 ($C$) 和 RBF 核参数 ($Gamma$),替代了传统的人工试错或网格搜索。
- 模拟数据生成:内置生成非线性二分类数据集(同心圆分布),无需外部文件即可直接运行演示。
- 数据标准化:包含数据归一化预处理流程,将特征映射至 [0, 1] 区间,提升计算收敛速度。
- 交叉验证:在寻优过程中采用 K-Fold (K=5) 交叉验证计算适应度,防止参数选择过程中的过拟合。
- 动态惯性权重:PSO 算法采用线性递减的惯性权重策略,平衡了前期的全局搜索能力和后期的局部开发能力。
- 全方位可视化:提供收敛曲线、真实值与预测值对比、混淆矩阵热力图以及二维决策边界的可视化展示。
系统要求
- MATLAB 版本:建议 R2016a 及以上版本。
- 工具箱支持:
* Statistics and Machine Learning Toolbox (用于
fitcsvm,
predict,
kfoldLoss 等函数)。
* Deep Learning Toolbox (旧称 Neural Network Toolbox,用于
mapminmax 函数,若无此工具箱需手动实现归一化)。
算法实现与核心逻辑详解
本项目的所有逻辑均封装在单一脚本中,实现了从数据清洗到模型评估的完整闭环。
1. 数据准备与预处理
- 数据生成:代码首先设置随机种子
rng(1) 以保证结果可复现。随后生成 300 个样本的非线性数据集,数据分布呈两个同心圆形状,非常适合测试 RBF 核 SVM 的非线性分类能力。 - 数据集划分:将数据集随机打乱后,按照 70% 训练集 和 30% 测试集 的比例进行拆分。
- 归一化:使用
mapminmax 函数对训练集特征进行 [0, 1] 归一化,并利用训练集的归一化参数将测试集映射到相同的尺度,严格遵循了数据挖掘的规范。
2. 粒子群优化 (PSO) 核心流程
* 优化目标包含两个变量:惩罚因子 $C$ 和核参数 $Gamma$。
* 搜索范围设定为 [0.01, 100]。
* 种群规模 (
popSize) 设为 20。
* 每个粒子包含位置(参数值)和速度向量。
* 最大迭代次数 (
maxGen) 设为 50。
*
惯性权重 ($w$) 动态调整:从 0.9 线性递减至 0.4。随着迭代进行,算法从大范围探索逐渐转向小范围精细搜索。
*
速度与位置更新:利用个体最优 ($pbest$) 和全局最优 ($gbest$) 引导粒子移动,并对越界的速度和位置进行截断处理。
- 适应度评估:每一代通过计算当前参数下的交叉验证误差率来更新个体的适应度值。
3. 适应度函数设计 (cal_fitness)
- 为了评估某一组参数 ($C, Gamma$) 的好坏,代码定义了子函数用于计算适应度。
- 参数转换:MATLAB 的
fitcsvm 使用 KernelScale 参数,其与 $Gamma$ 的关系为 $KernelScale = 1/sqrt{Gamma}$。代码中显式进行了此转换。 - 模型评估:构建 SVM 模型并开启 5 折交叉验证 (
KFold, 5),返回交叉验证损失(分类错误率)作为适应度值。错误率越低,适应度越好。
4. 最终模型构建与评估
- PSO 迭代结束后,提取全局最优位置作为最佳参数
Best_C 和 Best_Gamma。 - 利用最佳参数在全部训练集上重新训练最终的 SVM 模型。
- 分别计算并输出训练集和独立测试集的分类准确率。
5. 结果可视化
代码最后部分生成四类图表以直观展示结果:
- PSO 进化曲线:展示每一代群体的最佳适应度(CV 错误率)变化,用于判断算法是否收敛。
- 预测对比图:在测试集上对比真实标签与预测标签,直观反映预测效果。
- 混淆矩阵:绘制热力图展示分类结果的详细分布(真阳性、假阳性等),并在图块中标记具体数值。
- SVM 决策边界:如果是二维特征数据,代码会生成网格点,绘制等高线图展示非线性决策边界,并用圆圈高亮标记出支持向量的位置。
使用方法
- 准备环境:打开 MATLAB,确保已安装必要的工具箱。
- 运行脚本:直接运行主脚本。
- 观察过程:
* 命令行窗口会实时显示 PSO 的迭代进度、当前代数以及最优误差值。
* 进度条 (Waitbar) 会同步显示优化进度。
- 查看结果:
* 运行结束后,控制台将打印最优参数 $C$ 和 $Gamma$ 的数值,以及最终的训练集和测试集准确率。
* 同时会弹出 4 个图形窗口展示可视化结果。
注意事项
- 数据替换:虽然代码内置了模拟数据生成,但已预留接口。若需使用自己的数据,只需注释掉数据生成部分,取消
xlsread 或 load 等读取数据代码的注释,并确保数据格式为最后一列是标签,其余列是特征即可。 - 参数调整:代码顶部的
PSO_params 结构体定义了算法的超参数(如种群大小、迭代次数),用户可根据实际数据集的数据量和复杂度进行调整。