支持向量机(SVM)分类与参数优化教学示例
项目介绍
本项目是一个专为机器学习初学者设计的教学实践案例,基于 MATLAB 平台实现。支持向量机(SVM)作为统计学习理论中的经典算法,通过建立最优超平面来实现分类任务。本项目通过完整的代码流程,涵盖了从原始数据生成到最终模型评估的闭环,旨在帮助用户直观理解 SVM 的数学原理、核函数的作用、以及通过自动化手段优化模型超参数的方法。
功能特性
- 非线性数据模拟:自动生成具有环形分布特征的非线性数据集,直观演示线性分类器的局限性。
- 特征预处理:内置 Z-score 标准化流程,展示如何处理特征量级差异对 SVM 性能的影响。
- 多核函数试验场:对比线性核(Linear)、径向基核(RBF/Gaussian)和多项式核(Polynomial)在同一数据集上的决策边界差异。
- 自动化调参系统:利用网格搜索(Grid Search)配合 k 折交叉验证(k-fold Cross Validation)自动寻找最佳惩罚参数 C 和核参数 Gamma。
- 结果深度可视化:不仅绘制分类边界,还能够提取并高亮显示模型中的关键支持向量点。
- 多分类任务扩展:演示如何利用一对多(One-vs-All)策略将二分类 SVM 扩展至多分类应用(如鸢尾花分类)。
系统要求
- MATLAB R2018a 或更高版本
- Statistics and Machine Learning Toolbox(统计与机器学习工具箱)
算法实现逻辑与流程
本项目代码严格遵循机器学习建模的标准工作流,具体步骤如下:
数据生成与划分:
程序通过极坐标变换生成两类成环状分布的数据点,这种分布在原始空间中是线性不可分的。随后,利用交叉验证分区函数将数据按 8:2 的比例划分为训练集与测试集,确保评估结果的真实性。
标准化处理:
考虑到 SVM 计算数据点间的距离,代码计算了训练集的均值和标准差,并对训练集和测试集执行了 Z-score 标准化。这一步骤是保证模型收敛和分类准确性的关键。
核函数对比:
通过循环遍历不同的核函数类型,调用 SVM 模型训练函数进行静态建模。利用 meshgrid 生成覆盖绘图区域的网格点,计算每个点的决策得分并绘制零等高线,从而展示不同核函数生成的决策边界形状。
网格搜索优化:
程序设定了惩罚参数 C 和核参数 Gamma 的对数搜索范围。在每一组参数组合下,系统启动 5 折交叉验证,通过计算平均交叉验证损失来反馈当前参数的优劣,最终锁定的参数组将被用于构建最终生产模型。
模型评估与可视化:
使用优化后的参数训练最终模型,并在独立的测试集上验证。可视化部分通过填充颜色展示决策面的得分分布,使用特殊的标记点勾勒出对分类起关键作用的支持向量,使抽象的数学定义几何化。
多分类扩展应用:
加载经典的 Iris 鸢尾花数据集,利用多分类错误纠正输出(ECOC)框架和 SVM 模板训练多分类器,并计算混淆矩阵以评估三分类任务的性能。
关键函数与实现细节分析
fitcsvm:
这是 MATLAB 中构建支持向量机的核心函数。代码通过设置 KernelFunction 参数切换核函数,利用 BoxConstraint 设置惩罚因子 C。对于 RBF 核,通过调整 KernelScale 参数(其值与 Gamma 呈反比关系)来控制局部感应强度。
kfoldLoss:
用于获取交叉验证中的分类误差系数。在代码中,该值被转换为准确率(1 - Loss),作为评估超参数组合好坏的唯一标准。
predict:
不仅用于对新样本进行类别判定,还用于输出分类得分。通过获取网格点上的得分,代码得以绘制出平滑的概率化决策区域图。
fitcecoc:
针对多分类任务,该函数实现了多类别的拆解逻辑。本项目默认采用一对多策略,将复杂的三个类别拆解为多个二分类子任务进行求解。
标准化传递:
代码中一个重要的细节是使用训练集的均值(mu)和标准差(sigma)去处理测试集,这模拟了现实中无法预知未来数据统计特征的真实建模场景,避免了数据泄露问题。
使用方法
- 确保已安装所需的 MATLAB 工具箱。
- 打开 MATLAB 环境,将当前工作路径指向程序所在文件夹。
- 直接点击运行脚本。
- 程序将依次弹出三个窗口:
- 窗口 1:对比展示线性、高斯和多项式核函数的分类效果。
- 窗口 2:展示经过网格搜索优化后的最优 RBF 核 SVM 决策边界,并标注出支持向量。
- 窗口 3:展示在鸢尾花数据集上的多分类边界划分结果。
- 命令行窗口(Command Window)将实时显示参数搜索进度、最优参数组合以及最终的模型评估指标。