基于MATLAB的原生支持向量机(SVM)算法工具包
项目介绍
本项目是一套完全基于MATLAB原生语法开发的支持向量机(SVM)源程序包。与依赖官方Statistics and Machine Learning Toolbox不同,本项目从底层数学原理出发,完整编写了SVM的核心算法逻辑,旨在提供一个独立、透明且易于由用户进行二次开发的算法框架。
该工具包特别适合用于理解SVM的内部工作机制(如SMO算法细节、核技巧实现),同时也适用于需要脱离官方工具箱环境运行的工程嵌入场景。通过模块化设计,项目实现了从数据生成、预处理、模型训练、参数寻优到结果可视化的全流程机器学习任务。
功能特性
- 原生算法实现:不依赖任何第三方工具箱,完全使用MATLAB基础矩阵运算实现。
- SMO算法求解:内置简化版序列最小优化(Sequential Minimal Optimization, SMO)算法,用于求解SVM的对偶二次规划问题。
- 多核函数支持:内置四种标准核函数,支持处理非线性不可分数据,包括:
* 线性核 (Linear)
* 多项式核 (Polynomial)
* 高斯径向基核 (RBF)
* Sigmoid核
- 多分类策略:实现了“一对多”(One-vs-Rest, OvR)策略,将二分类SVM扩展至多分类任务。
- 模型评估体系:集成K折交叉验证(K-Fold CV),自动计算准确率(Accuracy)、精确率(Precision)、召回率(Recall)及F1分数,并输出混淆矩阵。
- 数据预处理:包含自定义的最大最小归一化模块,将数据映射至[-1, 1]区间。
- 可视化功能:针对二维特征数据,支持绘制决策边界及支持向量的可视化。
系统要求
- MATLAB R2016b 或更高版本(代码主要使用基础矩阵操作,大部分版本均可兼容)。
- 不需要安装任何额外的工具箱(如Optimization Toolbox或Statistics Toolbox)。
使用方法
- 准备数据:程序内置了数据生成函数用于演示,用户也可以将其替换为自己的数据集(需保证输入格式为
N samples x D features)。 - 配置参数:在主程序中通过修改
svm_opts 结构体设置超参数(如惩罚系数 C、核函数类型 kernel_type、RBF参数 gamma 等)。 - 运行程序:直接运行主函数。程序将依次执行数据生成、归一化、交叉验证、模型训练、预测及评估绘图。
核心实现逻辑详解
本项目的所有功能逻辑均封装在一个单一的脚本文件中,各模块功能如下:
1. 核心训练算法 (SMO)
程序中的二分类训练函数完整实现了简化版的SMO算法。该算法通过迭代方式优化拉格朗日乘子(Alphas):
- KKT条件检查:在每次迭代中,寻找违反KKT条件的样本点。
- 启发式选择:采用随机方式选择第二个优化变量,以简化实现复杂度。
- 剪切与更新:计算两个变量的解边界(L和H),沿约束方向更新Alpha值,并动态更新偏置项
b。 - 支持向量提取:训练结束后,自动提取Alpha大于0的样本作为支持向量。
2. 多分类策略 (One-vs-Rest)
针对多分类问题,该工具包采用了OvR策略:
- 训练阶段:或者类别数 $K$,分别为每个类别训练一个“该类 vs 其他所有类”的二分类器。正类标签设为1,其他类设为-1。
- 预测阶段:将测试样本输入所有 $K$ 个模型,计算每个模型输出的置信度分数(即样本距离超平面的距离),取分数最高的类别作为最终预测结果。
3. 核函数库
通过独立的核矩阵计算函数,实现了将低维不可分数据映射到高维空间:
- Linear:直接计算矩阵内积。
- Poly:计算 $(gamma cdot u'v + coef0)^{degree}$。
- RBF:基于欧氏距离计算 $exp(-gamma |u-v|^2)$,支持向量化计算以提高效率。
- Sigmoid:计算 $tanh(gamma cdot u'v + coef0)$。
4. 数据预处理
实现了一个自定义的归一化函数,模仿了MATLAB官方
mapminmax 的行为:
- 计算每一维特征的最小值和最大值。
- 利用公式将数据线性映射到 [-1, 1] 区间,防止大数值特征主导目标函数。
- 支持记录映射参数,以便对测试集进行相同的变换。
5. 评估与验证
- 交叉验证:实现了标准的K折交叉验证逻辑,将数据集随机划分为K份,轮流进行训练和验证,用于评估模型的泛化能力。
- 性能指标:基于预测结果生成混淆矩阵。计算多分类的宏平均(Macro-average)精确率、召回率和F1分数,以平衡各类别在评估中的权重。
6. 可视化
可视化模块利用网格采样的方法绘制非线性决策边界:
- 并在特征空间中生成密集的网格点。
- 利用训练好的模型对所有网格点进行预测。
- 通过等高线图(Contour)展示分类边界,直观呈现SVM将数据空间划分为不同区域的效果。
注意事项
- 随机性:程序开头固定了随机种子(
rng(42)),以确保演示数据生成和SMO算法中的随机选择过程具有可复现性。 - 参数敏感性:SVM对参数(特别是RBF核的
gamma 和惩罚系数 C)非常敏感。如果分类效果不佳,建议通过调整 svm_opts 中的参数进行网格搜索。 - 数据维度:可视化功能仅针对二维特征数据生效,若特征维度大于2,程序将跳过绘图步骤但保留数值评估。