基于LIBSVM的FarutoUltimate增强型SVM工具箱
项目简介
本项目是一个在著名的LIBSVM库基础上进行深度二次开发的MATLAB支持向量机(SVM)工具箱。该项目旨在解决SVM应用于数据挖掘或模式识别时,关键参数(惩罚因子C和核参数g)选择困难的痛点。
通过集成网格搜索(Grid Search)、遗传算法(GA)和粒子群优化算法(PSO)三种主流的参数自动寻优策略,本工具箱能够帮助用户快速找到模型的最优参数组合。此外,项目不仅关注计算精度,还大幅增强了可视化的能力,提供了包括3D视图、等高线图、进化曲线和决策边界在内的多种图形展示,使模型训练过程透明化、直观化。
功能特性
- 非线性分类数据模拟:内置数据生成模块,可自动生成具有非线性可分特性的模拟数据集(同心圆/环结构),用于测试算法性能。
- 数据预处理:集成
mapminmax数据归一化流程,确保数据特征缩放至[0, 1]区间,提高SVM训练效率。 - 多策略参数寻优:
*
网格搜索 (Grid Search):全遍历搜索,可视化参数平面的3D视图和等高线。
*
遗传算法 (GA):基于进化论的全局搜索,支持锦标赛选择、算术交叉和高斯变异。
*
粒子群优化 (PSO):基于群体智能的快速搜索,包含动态惯性权重调整机制。
* 原始数据分布散点图。
* 参数寻优过程的适应度(准确率)收敛曲线。
* 参数与准确率关系的3D曲面图。
* 最终模型的各类决策边界可视化。
- 自动化对比:程序自动对比三种寻优算法的结果,择优选取最佳参数组合训练最终模型。
系统要求
- MATLAB (建议 R2016b 或更高版本)
- Statistics and Machine Learning Toolbox (必须,代码中有自动检测机制)
- LIBSVM 库 (需正确安装并配置路径,底层依赖其相关接口)
详细功能与算法实现逻辑
本次提供的 main.m 脚本是整个工具箱的核心执行入口,其内部具体实现逻辑如下:
1. 数据准备与预处理
程序首先设置随机种子(rng 42)以保证结果可复现。
- 数据生成:构建了一个包含200个样本的非线性分类问题。类别1分布在内圆(半径约为2),类别2分布在外环(半径约为5),并添加了高斯噪声以模拟真实环境。
- 数据打乱:使用
randperm随机打乱样本顺序,避免由于数据有序排列导致的训练偏差。 - 归一化:调用
mapminmax将特征维度归一化到[0, 1]范围,这对RBF核函数的SVM尤为重要。
2. SVM核心参数设置
定义了参数寻优的全局搜索范围:
- C (惩罚因子):搜索范围为 $2^{-5}$ 到 $2^{5}$。
- g (核参数 Gamma):搜索范围为 $2^{-5}$ 到 $2^{5}$。
- 交叉验证:采用5折交叉验证 (5-fold Cross Validation) 计算模型的泛化准确率。
3. 三种寻优算法的具体实现
#### 方法一:网格搜索 (Grid Search)
这是最基础但最可靠的寻优方法。
- 实现机制:通过嵌套循环遍历 log2(C) 和 log2(g) 的所有组合,步长设为 0.5。
- 评估:对每一个坐标点 (C, g) 进行SVM交叉验证,记录准确率。
- 输出与绘图:
* 生成参数空间的3D网格曲面图 (Mesh Plot),展示准确率随C和g变化的趋势。
* 绘制等高线图 (Contour Plot),并用红色星号标记出找到的全局最高准确率点。
#### 方法二:遗传算法 (GA)
采用手动编写的遗传算法逻辑,非MATLAB自带工具箱函数,便于自定义控制。
- 参数配置:种群规模20,最大进化代数20,交叉概率0.7,变异概率0.1。
- 编码方式:直接对 log2(C) 和 log2(g) 进行实数编码。
- 进化算子:
*
选择:采用锦标赛选择法(Tournament Selection)。
*
交叉:采用算术交叉(线性插值生成新个体)。
*
变异:对基因值叠加高斯噪声,并进行边界限制修剪。
- 输出:绘制最佳适应度(CV准确率)随进化代数变化的曲线,展示收敛过程。
#### 方法三:粒子群优化 (PSO)
采用手动编写的标准PSO算法逻辑。
- 参数配置:学习因子 c1=1.5 (个体经验), c2=1.7 (社会经验),粒子数20,最大迭代20。
- 权重策略:实现了线性递减惯性权重策略 (w_start=0.9 -> w_end=0.4),在初期侧重全局搜索,后期侧重局部精细搜索。
- 更新机制:每个粒子根据自身历史最优 (pBest) 和全局历史最优 (gBest) 更新速度和位置。
- 输出:绘制PSO的适应度收敛曲线,通常PSO具有比GA更快的收敛速度。
4. 结果决策与边界绘制
- 程序会在三种方法执行完毕后,自动比较它们的最高准确率。
- 选取表现最好的参数组合 (C, g) 作为最终参数。
- 利用最优参数在全部训练数据上重新训练SVM模型。
- 调用
draw_decision_boundary 函数,在二维平面上绘制数据点和分类决策边界,直观展示模型的分类效果。
使用方法
- 确保 MATLAB 路径中包含 LIBSVM 的相关文件(尤其是编译好的
mex 文件)。 - 将本目录下的所有
.m 文件添加到 MATLAB 当前工作路径。 - 在 MATLAB 命令窗口直接输入
main 并回车即可运行。 - 程序将依次弹出以下图形窗口:
* 原始数据分布图。
* Grid Search 的3D视图与等高线图。
* GA 进化过程曲线。
* PSO 迭代过程曲线。
* 最终的 SVM 分类决策边界图。
注意事项
- 本工具箱主要针对二分类问题进行演示。
- 脚本中包含了
is_empty(ver('stats')) 的检查,确保用户安装了统计工具箱,因为交叉验证等功能可能依赖部分基础统计函数。 - 为了演示速度,GA和PSO的迭代次数及种群规模设置较小(均为20),在实际工程应用中,建议适当增加这些参数以获得更稳定的全局最优解。