跳到主要内容

支持向量机

一、直观理解:在两类之间铺最宽的安全隔离带​

支持向量机(Support Vector Machine, SVM)寻找一条(高维中是一个超平面)分界,使两类样本分得开的同时,隔离带宽尽可能大。宽度越大,边界附近的扰动越不容易导致错分。

真正决定边界位置的,往往只是贴在隔离带边缘的少数点——支持向量。删掉远离边界的点,分界面通常不变;动一下支持向量,边界就会挪。

当数据在原始空间线性不可分时,核技巧把样本隐式映射到更高维特征空间,在那里做线性分隔,等价于在原空间得到弯曲边界。最常用的是径向基(RBF)核。

二、适用场景与优缺点​

类型说明
适用场景二分类边界清晰;中小样本、中高维;文本/基因等维数高;需要大间隔稳健边界;可用核刻画中等非线性。
核心优点大间隔理论动机清晰;核方法灵活;对维数相对友好;凸优化,有全局最优(软间隔目标下);支持向量稀疏存储。
局限与缺点原生二分类,多类需 ECOC/一对一;概率输出需额外校准;核与 C,γC,\gamma 敏感;训练规模大时变慢;可解释性不如线性模型。

使用前:标准化特征;明确是否线性可分;用网格+交叉验证选超参数;多类时选好编码策略。

三、核心原理​

1. 硬间隔线性 SVM​

标签 yi∈{−1,+1}y_i\in\{-1,+1\},超平面 wTx+b=0w^\mathsf{T}x+b=0。要求

yi(wTxi+b)≥1y_i(w^\mathsf{T}x_i+b)\ge 1

间隔为 2/∥w∥2/\|w\|,故最小化 12∥w∥2\frac{1}{2}\|w\|^2。

2. 软间隔​

引入松弛 ξi≥0\xi_i\ge 0:

min⁡w,b,ξ 12∥w∥2+C∑i=1nξi\min_{w,b,\xi}\ \frac{1}{2}\|w\|^2+C\sum_{i=1}^n\xi_i s.t.yi(wTxi+b)≥1−ξi, ξi≥0\text{s.t.}\quad y_i(w^\mathsf{T}x_i+b)\ge 1-\xi_i,\ \xi_i\ge 0

CC 越大,越不能容忍错分(更贴训练数据);CC 越小,间隔更宽、更正则。

3. 对偶与核​

对偶中出现内积 xiTxjx_i^\mathsf{T}x_j。用核 K(xi,xj)=φ(xi)Tφ(xj)K(x_i,x_j)=\varphi(x_i)^\mathsf{T}\varphi(x_j) 替换,得到非线性 SVM。RBF 核:

K(x,z)=exp⁡(−γ∥x−z∥2)K(x,z)=\exp(-\gamma\|x-z\|^2)

γ\gamma 大 → 影响范围窄、边界更曲折;γ\gamma 小 → 更平滑。

决策函数:

y^(x)=sign(∑i∈SVαiyiK(xi,x)+b)\hat y(x)=\mathrm{sign}\Big(\sum_{i\in SV}\alpha_i y_i K(x_i,x)+b\Big)

四、关键决策​

决策点建议
核先试 linear,不够再 rbf;多项式核较少作为首选
CC对数网格,如 10−2∼10310^{-2}\sim 10^{3}
γ\gammaRBF 必需;可与 KernelScale 联动搜索
标准化强烈建议
类别不平衡使用不同类的 BoxConstraint 或代价矩阵
多分类fitcecoc + SVM 学习器
概率需要概率时用 fitSVMPosterior 或平台提供的 posterior

五、MATLAB 示例​

% 线性可分倾向的数据
X = [
1 2; 2 1; 2 3; 3 2; % 类 1
6 7; 7 6; 7 8; 8 7 % 类 2
];
y = [1;1;1;1; 2;2;2;2];

Xz = zscore(X);

% 线性 SVM
svmLin = fitcsvm(Xz, y, ...
"KernelFunction", "linear", ...
"BoxConstraint", 1, ...
"Standardize", false, ...
"ClassNames", [1 2]);

svIdx = svmLin.IsSupportVector;
fprintf("支持向量个数:%d\n", sum(svIdx));

[label, score] = predict(svmLin, Xz);
disp("线性 SVM 混淆矩阵:");
disp(confusionmat(y, label));

% RBF SVM + 超参数搜索(小例子演示)
svmRbf = fitcsvm(Xz, y, ...
"KernelFunction", "rbf", ...
"KernelScale", "auto", ...
"BoxConstraint", 1);

% 手动网格(更可控)
Cs = [0.1 1 10];
ks = [0.5 1 2]; % KernelScale
bestLoss = inf; bestC = NaN; bestKs = NaN;
for C = Cs
for ksVal = ks
m = fitcsvm(Xz, y, "KernelFunction", "rbf", ...
"BoxConstraint", C, "KernelScale", ksVal);
loss = kfoldLoss(crossval(m, "KFold", 4));
if loss < bestLoss
bestLoss = loss; bestC = C; bestKs = ksVal;
end
end
end
fprintf("最优 C=%.3g, KernelScale=%.3g, CV loss=%.3f\n", ...
bestC, bestKs, bestLoss);

svmBest = fitcsvm(Xz, y, "KernelFunction", "rbf", ...
"BoxConstraint", bestC, "KernelScale", bestKs);

% 多分类示例框架
% Mdl = fitcecoc(Xz, yMulti, "Learners", templateSVM("KernelFunction","rbf"));

六、如何解释结果​

  1. 支持向量:标出哪些样本支撑边界,检查是否为噪声点;
  2. 线性 SVM 的 ww:系数大小反映特征对决策函数的贡献(标准化后更可比);
  3. CC 与间隔:大 CC 训练错分少但可能过拟合;
  4. 核尺度:RBF 边界是否对个别点形成“孤岛”;
  5. 报告:CC、核、γ\gamma/KernelScale、支持向量比例、CV 指标、与 Logistic/树模型对比。

非线性核没有简单的“每个原始特征一个系数”,解释可配合部分依赖或 SHAP。

七、常见误区​

1. 不标准化就用 RBF/线性 SVM​

尺度主导内积与距离,参数网格会失效。

2. 只调 CC 不调 γ\gamma​

RBF 的两个旋钮必须联合看,否则网格不完整。

3. 把决策函数值直接当概率​

score 与概率单调相关但未必校准。

4. 样本极大时默认二次规划硬上​

大数据应考虑线性 SVM(fitclinear)、近似核或降采样。

5. 多类问题忽略类别编码与混淆模式​

一对一投票可能掩盖某两类之间的系统错误。

八、小结​

SVM 通过最大化间隔(软间隔下权衡错分惩罚)学习决策边界,核技巧在不显式升维的情况下实现非线性分类。

它是中小样本、边界清晰问题上的经典强模型。实践上:先标准化,先线性核,再 RBF;用交叉验证锁 CC 与核参数;用支持向量与基线对比写清论文故事。