周志华《Machine Learning》学习笔记--第六章--支持向量机

最大间隔分类利器:从硬间隔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,优化目标:

min⁡w,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核心规则

  1. 优先选取违反KKT最严重的αi\alpha_iαi;
  2. 再选与αi\alpha_iαi对应样本间隔最大的αj\alpha_jαj;
  3. 固定其余α\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 优化目标与约束

min⁡w,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原生二分类,多分类常用两种方案:

  1. OvR一对其余 :NNN类训练NNN个SVM,每类当正例、剩余全负例,预测选置信最高类别;
  2. 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实验结果表
结果分析
  1. 高斯核非线性划分能力更强,准确率优于线性核;
  2. 绿色空心圈为支持向量,SVM仅依靠少量关键点构造分类边界;
  3. 调高CCC值(如C=100C=100C=100)高斯核易在小数据集过拟合,准确率下降。


图6.4:左线性核决策边界(直线),右RBF核非线性曲线边界【实验生成图】

七、SVM优缺点总结&落地场景

优点

  1. 最大间隔天然抗过拟合,小样本数据集表现优异;
  2. 核技巧适配线性+全场景非线性问题;
  3. 模型仅依赖支持向量,内存占用低。

缺点

超大样本训练速度慢,多分类原生不友好,超参数C、γC、\gammaC、γ调参繁琐。

落地场景:早期文本垃圾邮件分类、人脸小样本识别、医疗病理影像二分类。

趣味冷知识:早期手写数字识别任务,SVM效果碾压同期BP神经网络,是90年代机器学习顶流算法。

相关推荐
casual~1 小时前
【学习记录】
学习·算法
社交怪人1 小时前
【奇偶ASCII值】信息学奥赛一本通C语言解法(题号1042)
算法
Wils0nEdwards1 小时前
技术栈的学习
学习
大模型最新论文速读1 小时前
06-04 · LLM 最新论文速览
论文阅读·人工智能·深度学习·机器学习·自然语言处理
清辞8532 小时前
入门大模型工程师第四课----通过RAG增强大模型原本无法回答的问题
大数据·人工智能·学习·语言模型
牢七2 小时前
吾爱破解安卓逆向入门教程学习
学习
噜噜噜阿鲁~2 小时前
python学习笔记 | 12.0、错误、调试和测试
笔记·python·学习
小欣加油2 小时前
leetcode3635 最早完成陆地和水上游乐设施的时间II
数据结构·c++·算法·leetcode
三品吉他手会点灯2 小时前
C语言学习笔记 - 46.运算符和表达式 - 运算符4 - 对初学运算符的一些建议
c语言·开发语言·笔记·学习