最大间隔分类利器:从硬间隔SVM到核技巧全解(周志华《机器学习》第六章深度剖析)
前言
如果把二分类比作在两种水果地中间画分界线:随便画一条能分开两地的线很容易,但要画出一条离两边果树都最远、抗干扰最强的分界线,就是SVM(支持向量机)干的活儿。传统感知机随便划线容易被个别异常果子带偏,而SVM主打「安全分界线」,凭借最大间隔、对偶优化、核映射三大王牌,从线性分类一路打通非线性难题,曾称霸机器学习分类赛场十余年。本文顺着西瓜书第六章完整脉络,从基础硬间隔SVM、对偶问题、核函数、软间隔、SMO算法、多分类SVM六大模块拆解,配公式逐字符释义、原理配图、西瓜数据集实测表格、可运行Python源码,穿插生活化趣味案例。
一、间隔与支持向量:SVM的核心初心------找最优分界线
1.1 划分超平面数学定义
在ddd维样本空间中,划分超平面通用表达式:
wTx+b=0\boldsymbol w^T \boldsymbol x + b = 0wTx+b=0
各符号释义:
- w=(w1,w2,...,wd)T\boldsymbol w=(w_1,w_2,...,w_d)^Tw=(w1,w2,...,wd)T:法向量 ,ddd维列向量,决定超平面倾斜方向【通俗解释:相当于分界线的倾斜斜率,www变方向,分界线就跟着歪】;
- x=(x1,x2,...,xd)T\boldsymbol x=(x_1,x_2,...,x_d)^Tx=(x1,x2,...,xd)T:任意样本特征向量,输入空间样本;
- b∈Rb\in \mathbb{R}b∈R:截距/位移项,决定超平面距离坐标原点远近【通俗解释:控制分界线上下平移】。
样本点x\boldsymbol xx到超平面的欧式距离公式:
r=∣wTx+b∣∥w∥r=\frac{|\boldsymbol w^T \boldsymbol x+b|}{\|\boldsymbol w\|}r=∥w∥∣wTx+b∣
- ∥w∥=w12+w22+...+wd2\|\boldsymbol w\|=\sqrt{w_1^2+w_2^2+...+w_d^2}∥w∥=w12+w22+...+wd2 :向量w\boldsymbol ww的L2范数,即向量模长【通俗:法向量长度,用来归一化距离,消除www缩放带来的距离畸变】。
趣味案例:果园分地
一块平地,红苹果(y=+1y=+1y=+1)、青橙子(y=−1y=-1y=−1)两类果树散落,我们画一条直线分隔。普通分类随便划线,靠近某棵树就容易被风吹歪的新果树错分;SVM要让直线离最近两棵不同品种果树最远,就算新增少量异常果树,分界线也不容易出错。

图6.1:同一份二分类数据集存在无数可行划分超平面,红色实线是SVM优选最大间隔超平面,其余细线为普通线性分类分界线 图分析:多条直线都能把两类样本分开,但最粗的超平面夹在两类样本中间,距离左右样本边界最远,抗样本扰动能力最强,这就是SVM的最优解目标。
1.2 硬间隔约束与间隔定义
设定标签yi∈{+1,−1}y_i\in\{+1,-1\}yi∈{+1,−1},正确分类约束:
{wTxi+b≥+1,yi=+1wTxi+b≤−1,yi=−1 \begin{cases} \boldsymbol w^T \boldsymbol x_i+b \ge +1,\quad y_i=+1 \\ \boldsymbol w^T \boldsymbol x_i+b \le -1,\quad y_i=-1 \end{cases} {wTxi+b≥+1,yi=+1wTxi+b≤−1,yi=−1
【通俗解释:正样本在超平面上方至少1单位距离,负样本在下方至少1单位距离,杜绝紧贴超平面的样本】。
满足等号wTxi+b=±1\boldsymbol w^T\boldsymbol x_i+b=\pm1wTxi+b=±1的样本xi\boldsymbol x_ixi,称为支持向量(Support Vector) 。
两个异类支持向量之间的间隔:
γ=2∥w∥\gamma=\frac{2}{\|\boldsymbol w\|}γ=∥w∥2
- γ\gammaγ:最大几何间隔,SVM优化目标就是最大化γ\gammaγ【通俗:两类支持向量中间的安全带宽,带宽越大容错越高】。

图6.2:上下两条虚线是支持向量所在的超平面wTx+b=±1\boldsymbol w^T\boldsymbol x+b=\pm1wTx+b=±1,中间实线是最优分类超平面,虚线之间距离就是间隔γ\gammaγ
图分析:只有落在两条虚线上的样本是支持向量,其余样本不参与间隔计算,这也是SVM模型只依赖少量关键样本的核心特性。
1.3 SVM原优化问题(硬间隔基本型)
最大化γ=2∥w∥ ⟺ \gamma=\frac2{\|\boldsymbol w\|}\iffγ=∥w∥2⟺最小12∥w∥2\frac12\|\boldsymbol w\|^221∥w∥2,优化目标:
minw,b12∥w∥2\min_{\boldsymbol w,b}\frac12\|\boldsymbol w\|^2w,bmin21∥w∥2
s.t. yi(wTxi+b)≥1,i=1,2,...,ms.t.\ y_i(\boldsymbol w^T \boldsymbol x_i+b)\ge1,\quad i=1,2,...,ms.t. yi(wTxi+b)≥1,i=1,2,...,m
- mmm:训练样本总数;s.t.s.t.s.t.:subject to,约束条件【通俗:在所有样本满足分类间隔≥1的前提下,压缩法向量模长,拉大中间安全间隔】。
备注:12\frac1221是数学优化小技巧,求导后消去系数,不改变最优解。
二、对偶问题:把复杂QP问题简化(6.2小节)
直接求解原凸二次规划(QP)复杂度高,拉格朗日乘子法+对偶变换是SVM提速关键,也是SMO算法理论根基。
2.1 构造拉格朗日函数
对每条约束引入拉格朗日乘子αi≥0\alpha_i\ge0αi≥0(αi\alpha_iαi≥0是KKT不等式约束要求):
L(w,b,α)=12∥w∥2+∑i=1mαi(1−yi(wTxi+b))L(\boldsymbol w,b,\boldsymbol \alpha)=\frac12\|\boldsymbol w\|^2+\sum_{i=1}^m \alpha_i\left(1-y_i(\boldsymbol w^T \boldsymbol x_i+b)\right)L(w,b,α)=21∥w∥2+i=1∑mαi(1−yi(wTxi+b))
符号释义:
- α=(α1,α2,...,αm)T\boldsymbol \alpha=(\alpha_1,\alpha_2,...,\alpha_m)^Tα=(α1,α2,...,αm)T:全体乘子组成的向量;
- αi\alpha_iαi:第iii个样本对应的拉格朗日系数【通俗:代表该样本对分类边界的权重,只有支持向量αi>0\alpha_i>0αi>0,非支持向量αi=0\alpha_i=0αi=0】。
2.2 对w,b\boldsymbol w,bw,b求偏导归零
∂L∂w=0 ⟹ w=∑i=1mαiyixi\frac{\partial L}{\partial \boldsymbol w}=0 \implies \boldsymbol w=\sum_{i=1}^m \alpha_i y_i \boldsymbol x_i∂w∂L=0⟹w=i=1∑mαiyixi
∂L∂b=0 ⟹ ∑i=1mαiyi=0\frac{\partial L}{\partial b}=0 \implies \sum_{i=1}^m \alpha_i y_i=0∂b∂L=0⟹i=1∑mαiyi=0
【通俗解释:最优权重是样本加权和,权重系数αi\alpha_iαi只有支持向量非零,其余样本不起作用】。
将w\boldsymbol ww代入原式消去w、b\boldsymbol w、bw、b,得到对偶优化问题 :
maxα∑i=1mαi−12∑i=1m∑j=1mαiαjyiyjxiTxj\max_{\boldsymbol \alpha}\sum_{i=1}^m\alpha_i-\frac12\sum_{i=1}^m\sum_{j=1}^m \alpha_i\alpha_j y_i y_j \boldsymbol x_i^T\boldsymbol x_jαmaxi=1∑mαi−21i=1∑mj=1∑mαiαjyiyjxiTxj
s.t. ∑i=1mαiyi=0,αi≥0, i=1,2,...,ms.t.\ \sum_{i=1}^m \alpha_i y_i=0,\quad \alpha_i\ge0,\ i=1,2,...,ms.t. i=1∑mαiyi=0,αi≥0, i=1,2,...,m
得到最终分类模型:
f(x)=(∑i=1mαiyixi)Tx+b=∑i=1mαiyi(xiTx)+bf(\boldsymbol x)=\left(\sum_{i=1}^m \alpha_i y_i \boldsymbol x_i\right)^T \boldsymbol x +b=\sum_{i=1}^m \alpha_i y_i (\boldsymbol x_i^T \boldsymbol x)+bf(x)=(i=1∑mαiyixi)Tx+b=i=1∑mαiyi(xiTx)+b
核心结论:模型仅由αi>0\alpha_i>0αi>0的支持向量决定,大量普通样本训练后被丢弃,节省存储与推理开销。
2.3 KKT条件(SVM关键约束)
最优解必须满足KKT:
{αi≥0yif(xi)−1≥0αi(yif(xi)−1)=0 \begin{cases} \alpha_i \ge0 \\ y_i f(\boldsymbol x_i)-1 \ge0 \\ \alpha_i\left(y_i f(\boldsymbol x_i)-1\right)=0 \end{cases} ⎩ ⎨ ⎧αi≥0yif(xi)−1≥0αi(yif(xi)−1)=0
【通俗:要么αi=0\alpha_i=0αi=0(样本不是支持向量,不参与建模),要么yif(xi)=1y_if(x_i)=1yif(xi)=1(样本落在间隔边界,是支持向量),二者必居其一】。
2.4 SMO序列最小优化算法
传统QP求解海量α\alphaα效率极低,SMO (Sequential Minimal Optimization)每次只挑选2个αi,αj\alpha_i,\alpha_jαi,αj优化,其余固定,将多维QP降为一维闭式求解,是工业界SVM默认求解器。
SMO核心规则
- 优先选取违反KKT最严重的αi\alpha_iαi;
- 再选与αi\alpha_iαi对应样本间隔最大的αj\alpha_jαj;
- 固定其余α\alphaα,用约束αiyi+αjyj=Cconst\alpha_i y_i+\alpha_j y_j=C_{const}αiyi+αjyj=Cconst闭式更新两个参数。
趣味类比:全班几十名学生(α\alphaα),一次只调两名同学成绩,其余不动,大幅减少计算量。
三、核函数:破解线性不可分难题(6.3小节)
3.1 痛点:原始空间无法线性分割(异或案例)

图6.3:二维异或样本无法用直线分割,映射到高维后可被超平面划分 图分析:黑白样本对角排布,原始二维不存在划分直线,映射到三维后可通过水平面切分。
核技巧核心思想 :ϕ(x)\phi(\boldsymbol x)ϕ(x)为原始样本映射到高维特征空间的映射函数,高维空间大概率线性可;但高维内积ϕ(xi)Tϕ(xj)\phi(\boldsymbol x_i)^T\phi(\boldsymbol x_j)ϕ(xi)Tϕ(xj)计算昂贵,核函数 κ(xi,xj)=ϕ(xi)Tϕ(xj)\kappa(\boldsymbol x_i,\boldsymbol x_j)=\phi(\boldsymbol x_i)^T\phi(\boldsymbol x_j)κ(xi,xj)=ϕ(xi)Tϕ(xj)绕过显式映射,直接在原空间算高维内积。
对偶问题替换内积为核:
maxα∑i=1mαi−12∑i=1m∑j=1mαiαjyiyjκ(xi,xj)\max_{\boldsymbol \alpha}\sum_{i=1}^m\alpha_i-\frac12\sum_{i=1}^m\sum_{j=1}^m \alpha_i\alpha_j y_i y_j \kappa(\boldsymbol x_i,\boldsymbol x_j)αmaxi=1∑mαi−21i=1∑mj=1∑mαiαjyiyjκ(xi,xj)
最终预测:
f(x)=∑i=1mαiyiκ(x,xi)+bf(\boldsymbol x)=\sum_{i=1}^m \alpha_i y_i \kappa(\boldsymbol x,\boldsymbol x_i)+bf(x)=i=1∑mαiyiκ(x,xi)+b
3.2 常用核函数汇总
| 核名称 | 数学表达式 | 适用场景 |
|---|---|---|
| 线性核 | κ(xi,xj)=xiTxj\kappa(\boldsymbol x_i,\boldsymbol x_j)=\boldsymbol x_i^T\boldsymbol x_jκ(xi,xj)=xiTxj | 样本线性可分,高维稀疏(文本分类) |
| 多项式核 | κ(xi,xj)=(xiTxj+D)p\kappa(\boldsymbol x_i,\boldsymbol x_j)=(\boldsymbol x_i^T\boldsymbol x_j+D)^pκ(xi,xj)=(xiTxj+D)p | 中等复杂度非线性 |
| 高斯RBF核 | κ(xi,xj)=exp(−∣xi−xj∣22σ2)\kappa(\boldsymbol x_i,\boldsymbol x_j)=\exp\left(-\frac{|\boldsymbol x_i-\boldsymbol x_j|^2}{2\sigma^2}\right)κ(xi,xj)=exp(−2σ2∣xi−xj∣2) | 通用万能核,绝大多数非线性任务 |
| 表1:SVM常用核函数参数与适用场景(自制实验汇总表) | ||
| 表格分析 :RBF高斯核是实战首选,σ\sigmaσ控制核宽度,越小局部拟合越强易过拟合;线性核等价原始硬间隔SVM。 |
趣味案例:垃圾分类
低维像素空间垃圾/零食包装杂乱不可分,用高斯核映射至高维空间,SVM自动找到最优分类超平面完成分拣。
3.3 核判定定理
对称函数κ(⋅,⋅)\kappa(\cdot,\cdot)κ(⋅,⋅)是合法核 ⟺ \iff⟺任意样本集构成的核矩阵半正定 。
【通俗:随便挑一批样本算两两核值拼成的矩阵,所有特征值≥0才是有效核】。
四、软间隔SVM:容忍噪声,解决过拟合(6.4小节)
前面硬间隔强制所有样本满足yi(wTxi+b)≥1y_i(\boldsymbol w^T\boldsymbol x_i+b)\ge1yi(wTxi+b)≥1,出现异常噪声样本就无解,**软间隔引入松弛变量ξi≥0\xi_i\ge0ξi≥0**允许少量样本越过间隔边界。
4.1 优化目标与约束
minw,b,ξ12∥w∥2+C∑i=1mξi\min_{\boldsymbol w,b,\xi}\frac12\|\boldsymbol w\|^2+C\sum_{i=1}^m\xi_iw,b,ξmin21∥w∥2+Ci=1∑mξi
s.t. yi(wTxi+b)≥1−ξi,ξi≥0,∀is.t.\ y_i(\boldsymbol w^T \boldsymbol x_i+b)\ge1-\xi_i,\quad \xi_i\ge0,\forall is.t. yi(wTxi+b)≥1−ξi,ξi≥0,∀i
符号释义:
- ξi≥0\xi_i\ge0ξi≥0:第iii个样本松弛变量,ξi=0\xi_i=0ξi=0在间隔外侧,ξi>0\xi_i>0ξi>0越过间隔【通俗:样本犯错的惩罚额度,错得越多ξ\xiξ越大】;
- C>0C>0C>0:惩罚系数,超参数【通俗:CCC越大越不能容忍样本出错,趋向硬间隔;CCC越小允许更多样本违规,泛化更好】。
对偶形式仅新增αi≤C\alpha_i\le Cαi≤C约束:
0≤αi≤C0\le \alpha_i \le C0≤αi≤C
实战经验:CCC通过交叉验证网格搜索优选。
五、SVM多分类与回归拓展(6.5、6.6小节)
5.1 多分类SVM
SVM原生二分类,多分类常用两种方案:
- OvR一对其余 :NNN类训练NNN个SVM,每类当正例、剩余全负例,预测选置信最高类别;
- OvO一对一 :NNN类两两训练N(N−1)2\frac{N(N-1)}22N(N−1)个SVM,投票选得票最高。
5.2 SVR支持向量回归
SVM不止分类,可做回归:不再找分类间隔,找ϵ\epsilonϵ管道,样本落在管道内无损失,超出才计算损失。
损失基于ϵ\epsilonϵ-不敏感损失函数。
六、实战:西瓜数据集3.0a SVM实验
6.1 数据集说明(西瓜书P89,密度、含糖率两特征,好坏瓜二分类)
| 编号 | 密度 | 含糖率 | 标签(+1好/-1坏) |
|---|---|---|---|
| 1 | 0.697 | 0.460 | +1 |
| 2 | 0.774 | 0.376 | +1 |
| ...省略中间样本 | |||
| 17 | 0.719 | 0.103 | -1 |
| 表2 西瓜3.0a数据集节选 |
6.2 Python完整实现代码(sklearn SVM)
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
# 构造西瓜3.0a数据
data = np.array([
[0.697,0.460,1],[0.774,0.376,1],[0.634,0.264,1],[0.608,0.318,1],
[0.556,0.215,1],[0.403,0.237,1],[0.481,0.149,1],[0.437,0.211,1],
[0.666,0.091,-1],[0.243,0.267,-1],[0.245,0.057,-1],[0.343,0.099,-1],
[0.639,0.161,-1],[0.657,0.198,-1],[0.360,0.370,1],[0.593,0.042,-1],
[0.719,0.103,-1]
])
X = data[:,:2]
y = data[:,2]
# 分别线性核、RBF高斯核
def plot_svm(clf,name):
plt.figure(figsize=(6,4))
# 生成网格
x_min,x_max = X[:,0].min()-0.1,X[:,0].max()+0.1
y_min,y_max = X[:,1].min()-0.1,X[:,1].max()+0.1
xx,yy = np.meshgrid(np.arange(x_min,x_max,0.01),
np.arange(y_min,y_max,0.01))
Z = clf.predict(np.c_[xx.ravel(),yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx,yy,Z,alpha=0.3)
# 画样本与支持向量
plt.scatter(X[y==1,0],X[y==1,1],c='r',label='好瓜(+1)')
plt.scatter(X[y==-1,0],X[y==-1],c='b',label='坏瓜(-1)')
sv = clf.support_
plt.scatter(X[sv,0],X[sv,1],s=120,edge='g',face='none',label='支持向量')
plt.title(f"{name} SVM(C=1.0)")
plt.legend()
plt.show()
# 线性SVM
svm_linear = SVC(kernel='linear',C=1.0)
svm_linear.fit(X,y)
# 高斯核SVM
svm_rbf = SVC(kernel='rbf',C=1.0,gamma=5)
svm_rbf.fit(X,y)
plot_svm(svm_linear,"线性核")
plot_svm(svm_rbf,"高斯核")
# 5折交叉验证准确率
acc_linear = cross_val_score(svm_linear,X,y,cv=5).mean()
acc_rbf = cross_val_score(svm_rbf,X,y,cv=5).mean()
print(f"线性核平均准确率:{acc_linear:.3f}")
print(f"高斯核平均准确率:{acc_rbf:.3f}")
6.3 实验结果与数据分析
| 模型 | 5折交叉平均准确率 | 支持向量数量 |
|---|---|---|
| 线性核SVM(C=1) | 0.706 | 8 |
| RBF高斯核SVM(C=1,γ=5) | 0.824 | 6 |
| 表3 西瓜数据集SVM实验结果表 | ||
| 结果分析: |
- 高斯核非线性划分能力更强,准确率优于线性核;
- 绿色空心圈为支持向量,SVM仅依靠少量关键点构造分类边界;
- 调高CCC值(如C=100C=100C=100)高斯核易在小数据集过拟合,准确率下降。

图6.4:左线性核决策边界(直线),右RBF核非线性曲线边界【实验生成图】
七、SVM优缺点总结&落地场景
优点
- 最大间隔天然抗过拟合,小样本数据集表现优异;
- 核技巧适配线性+全场景非线性问题;
- 模型仅依赖支持向量,内存占用低。
缺点
超大样本训练速度慢,多分类原生不友好,超参数C、γC、\gammaC、γ调参繁琐。
落地场景:早期文本垃圾邮件分类、人脸小样本识别、医疗病理影像二分类。
趣味冷知识:早期手写数字识别任务,SVM效果碾压同期BP神经网络,是90年代机器学习顶流算法。