Support Vector Machine (SVM) —— 支持向量机
前言
在前两篇文章中,我们分别讨论了线性回归和逻辑回归。如果说线性回归是机器学习的“Hello World”,逻辑回归是二分类的“标配”,那么支持向量机(Support Vector Machine, SVM) 就是传统机器学习时代最具理论深度和美学魅力的算法之一。
俗话说,SVM有三宝:间隔、对偶、核技巧。这句话精准地概括了SVM最精髓的三个部分:
- 间隔:SVM的核心思想是最大化分类超平面与最近样本点之间的距离
- 对偶:通过拉格朗日对偶性将原始问题转化为更易求解的对偶问题
- 核技巧:通过核函数将数据映射到高维空间,处理非线性分类问题
这篇文章,我们会从函数间隔与几何间隔的定义出发,一步步推导硬间隔SVM的原始问题、对偶问题及KKT条件,然后引入软间隔和松弛变量处理线性不可分数据,最后深入探讨SVM与逻辑回归在离群点鲁棒性上的本质差异。
一、函数间隔与几何间隔
1.1 超平面与分类决策
在二分类问题中,我们有一组训练样本 {(xi,yi)}i=1N,其中 xi∈Rp,yi∈{+1,−1}。
我们希望找到一个超平面 wTx+b=0 将两类样本分开。对于任意样本点 xi,分类决策为:
sign(wTxi+b)={+1,−1,wTxi+b>0wTxi+b<01.2 函数间隔(Functional Margin)
函数间隔的定义为:
γ^i=yi(wTxi+b)
其含义是:
- 如果分类正确,yi(wTxi+b)>0,函数间隔为正
- ∣wTxi+b∣ 越大,分类的确信度越高
- 但函数间隔有一个严重的问题:如果同时将 w 和 b 放大 2 倍,超平面本身完全不变,但函数间隔也会放大 2 倍
因此,函数间隔不适合直接作为优化目标。
1.3 几何间隔(Geometric Margin)
几何间隔定义为样本点到超平面的真实距离:
γi=∥w∥yi(wTxi+b)
几何间隔就是点到超平面的距离。它的绝对值与点到直线的距离公式完全一致。
函数间隔与几何间隔的关系为:
γi=∥w∥γ^i
关键区别:几何间隔对 w 和 b 的缩放是不变的——同时放大 w 和 b,几何间隔保持不变。
1.4 为什么最大化几何间隔?
对于一个包含 N 个点的数据集,分类的确信度与间隔大小正相关。我们希望找到的超平面,不仅要能正确分类,还要让所有样本点都尽可能远离超平面。这样,当新样本到来时,即使有轻微的扰动,也不容易被误分类。
因此,SVM 的目标是最大化最小几何间隔:
maxw,bγ,s.t.∥w∥yi(wTxi+b)≥γ,i=1,2,...,N
其中 γ=miniγi,即所有样本点中最小的几何间隔。
二、硬间隔SVM:原始问题
2.1 从最大化间隔到最小化 ∥w∥
令 γ^=γ∥w∥,上述优化目标可改写为:
maxw,b∥w∥γ^,s.t.yi(wTxi+b)≥γ^,i=1,2,...,N
由于我们可以通过成比例地缩放 w 和 b 来任意调节 γ^,不妨令 γ^=1。于是优化问题变为:
maxw,b∥w∥1,s.t.yi(wTxi+b)≥1,i=1,2,...,N
最大化 ∥w∥1 等价于最小化 ∥w∥,进一步等价于最小化 21∥w∥2(平方和 1/2 是为了后续求导方便)。
于是得到硬间隔SVM的原始问题(Primal Problem) :
w,bmin21∥w∥2
s.t.yi(wTxi+b)≥1,i=1,2,...,N
2.2 支持向量(Support Vectors)
使约束条件取等号的样本点,即 yi(wTxi+b)=1 的点,被称为支持向量。
两个异类支持向量到超平面的距离之和为:
Margin=∥w∥2
最大化间隔 ∥w∥2 等价于最小化 ∥w∥,这与我们的优化目标一致。
三、拉格朗日对偶与KKT条件
3.1 为什么要转化为对偶问题?
直接求解原始问题虽然可行,但转化为对偶问题有三个重要优势:
- 更容易求解:对偶问题的约束更简单
- 自然引入核函数:对偶形式中只出现样本的内积 xiTxj,可以用核函数替换
- 揭示支持向量的本质:只有支持向量对应的拉格朗日乘子非零
3.2 构造拉格朗日函数
对于原始问题,引入拉格朗日乘子 αi≥0(i=1,2,...,N),构造拉格朗日函数:
L(w,b,α)=21∥w∥2−∑i=1Nαi[yi(wTxi+b)−1]
展开为:
L(w,b,α)=21∥w∥2−∑i=1Nαiyi(wTxi+b)+∑i=1Nαi
3.3 对偶问题的推导
拉格朗日对偶问题为:
maxαminw,bL(w,b,α)
第一步:对 w 和 b 求极小
令 L(w,b,α) 对 w 和 b 的偏导为零:
∂w∂L=w−∑i=1Nαiyixi=0⇒w=∑i=1Nαiyixi
∂b∂L=−∑i=1Nαiyi=0⇒∑i=1Nαiyi=0
将这两个结果代回拉格朗日函数:
L(w,b,α)=∑i=1Nαi−21∑i=1N∑j=1Nαiαjyiyj(xiTxj)
第二步:对 α 求极大
得到对偶问题(Dual Problem) :
αmaxi=1∑Nαi−21i=1∑Nj=1∑NαiαjyiyjxiTxj
s.t.∑i=1Nαiyi=0,αi≥0,i=1,2,...,N
3.4 KKT条件
对于SVM这个凸优化问题,KKT条件是原始问题与对偶问题取得最优解的充分必要条件。
KKT条件包含以下四个部分:
(1)原始可行性(Primal Feasibility) :
yi(wTxi+b)−1≥0,i=1,2,...,N
(2)对偶可行性(Dual Feasibility) :
αi≥0,i=1,2,...,N
(3)互补松弛性(Complementary Slackness) :
αi[yi(wTxi+b)−1]=0,i=1,2,...,N
这个条件极其重要!它意味着:
- 如果 αi>0,则 yi(wTxi+b)=1 —— 该样本点是支持向量
- 如果 yi(wTxi+b)>1,则 αi=0 —— 该样本点对模型没有贡献
(4)梯度为零(Stationarity) :
w=∑i=1Nαiyixi,∑i=1Nαiyi=0
3.5 从对偶解回到原始解
求解对偶问题得到最优的 αi∗ 后,可以恢复原始参数:
w∗=∑i=1Nαi∗yixi
对于 b∗,选择任意一个支持向量(αs>0),由互补松弛条件:
ys(w∗Txs+b∗)=1
由于 ys2=1,两边同乘 ys:
b∗=ys−w∗Txs
在实际应用中,为了更鲁棒,通常取所有支持向量的平均值:
b∗=∣S∣1∑s∈S(ys−∑i∈SαiyixiTxs)
其中 S 是所有支持向量的下标集合。
1import numpy as np2from cvxopt import matrix, solvers3
4class HardMarginSVM:5 """硬间隔SVM(使用CVXOPT求解对偶问题)"""6
7 def __init__(self):8 self.alpha = None9 self.w = None10 self.b = None11 self.support_vectors = None12 self.support_labels = None13
14 def fit(self, X, y):15 n_samples, n_features = X.shape16
17 # 构建对偶问题的二次规划形式18 # 最大化: sum(alpha_i) - 0.5 * sum(alpha_i * alpha_j * y_i * y_j * x_i^T x_j)19 # 约束: sum(alpha_i * y_i) = 0, alpha_i >= 020
21 # P矩阵: P_ij = y_i * y_j * x_i^T x_j22 P = np.outer(y, y) * (X @ X.T)23 P = matrix(P.astype(np.float64))24
25 # q向量: q_i = -1 (因为cvxopt求解的是最小化)26 q = matrix(-np.ones(n_samples).astype(np.float64))27
28 # G矩阵和h向量: -alpha_i <= 0 => alpha_i >= 029 G = matrix(-np.eye(n_samples).astype(np.float64))30 h = matrix(np.zeros(n_samples).astype(np.float64))31
32 # A矩阵和b向量: sum(alpha_i * y_i) = 033 A = matrix(y.reshape(1, -1).astype(np.float64))34 b = matrix(np.zeros(1).astype(np.float64))35
36 # 求解QP37 sol = solvers.qp(P, q, G, h, A, b)38 self.alpha = np.array(sol['x']).flatten()39
40 # 计算w41 self.w = np.sum(self.alpha[:, None] * y[:, None] * X, axis=0)42
43 # 找出支持向量 (alpha > 1e-5)44 sv_idx = np.where(self.alpha > 1e-5)[0]45 self.support_vectors = X[sv_idx]46 self.support_labels = y[sv_idx]47
48 # 计算b (取支持向量的平均值)49 self.b = np.mean([50 self.support_labels[i] - self.w @ self.support_vectors[i]51 for i in range(len(self.support_vectors))52 ])53 return self54
55 def predict(self, X):56 return np.sign(X @ self.w + self.b)四、软间隔SVM:松弛变量与Hinge Loss
4.1 为什么要引入软间隔?
硬间隔SVM要求所有样本都能被正确分类且满足 yi(wTxi+b)≥1。这在现实数据中往往过于苛刻:
- 数据可能线性不可分(即使在高维空间)
- 可能存在噪声或离群点,强制完美分类会导致过拟合
4.2 松弛变量的引入
为了解决这个问题,软间隔SVM为每个样本引入一个松弛变量(Slack Variable) ξi≥0。
约束条件被放松为:
yi(wTxi+b)≥1−ξi,ξi≥0
松弛变量 ξi 的几何含义是:样本点 xi 到边界 wTx+b=±1 的距离。
- ξi=0:样本点在正确一侧且满足间隔要求
- 0<ξi<1:样本点在间隔内但在正确一侧
- ξi=1:样本点在超平面上
- ξi>1:样本点被误分类(位于超平面的错误一侧)
4.3 软间隔的原始问题
软间隔SVM的优化目标变为:
w,b,ξmin21∥w∥2+Ci=1∑Nξi
s.t.yi(wTxi+b)≥1−ξi,ξi≥0,i=1,2,...,N
其中 C>0 是惩罚参数,控制着“最大化间隔”和“最小化分类错误”之间的权衡:
- C→∞:迫使所有样本满足约束,退化为硬间隔
- C 较小时:允许更多样本违反约束,间隔更大,但分类错误可能更多
4.4 软间隔的对偶问题
构造拉格朗日函数(引入 αi≥0 和 μi≥0):
L(w,b,ξ,α,μ)=21∥w∥2+C∑i=1Nξi−∑i=1Nαi[yi(wTxi+b)−1+ξi]−∑i=1Nμiξi
对 w、b、ξi 求偏导并令其为零:
∂w∂L=w−∑i=1Nαiyixi=0⇒w=∑i=1Nαiyixi
∂b∂L=−∑i=1Nαiyi=0⇒∑i=1Nαiyi=0
∂ξi∂L=C−αi−μi=0⇒αi+μi=C
由于 μi≥0,可得 0≤αi≤C。
代入后得到软间隔SVM的对偶问题:
αmaxi=1∑Nαi−21i=1∑Nj=1∑NαiαjyiyjxiTxj
s.t.∑i=1Nαiyi=0,0≤αi≤C,i=1,2,...,N
与硬间隔的唯一区别:αi 的上限从 +∞ 变成了 C。
4.5 Hinge Loss:SVM的另一种视角
软间隔SVM可以等价地写成一个无约束优化问题:
minw,b21∥w∥2+C∑i=1Nmax(0,1−yi(wTxi+b))
其中 max(0,1−yi(wTxi+b)) 就是著名的 Hinge Loss(合页损失) 。
Hinge Loss 的数学定义为:
Lhinge(z)=max(0,1−z),z=yi(wTxi+b)
Hinge Loss 的特性:
- 当 yi(wTxi+b)≥1 时,损失为 0(样本已经被正确分类且距离足够远)
- 当 yi(wTxi+b)<1 时,损失线性增加
- 它是分段线性的,在 z=1 处不可导
松弛变量 ξi 与 Hinge Loss 的关系为:
ξi=max(0,1−yi(wTxi+b))
因此,软间隔SVM的原始问题可以理解为:L2正则化 + Hinge Loss。
1def hinge_loss(y_true, y_pred):2 """Hinge Loss: max(0, 1 - y * y_pred)"""3 return np.maximum(0, 1 - y_true * y_pred)4
5# 示例6y_true = np.array([1, -1, 1, -1])7y_pred = np.array([0.8, -0.9, 1.5, 0.5])8losses = hinge_loss(y_true, y_pred)9print(f"Hinge Losses: {losses}")10# 输出: [0.2, 0.1, 0. , 1.5]11# 解释:12# - 第1个样本: 1*0.8=0.8<1, 损失0.213# - 第2个样本: (-1)*(-0.9)=0.9<1, 损失0.114# - 第3个样本: 1*1.5=1.5>=1, 损失015# - 第4个样本: (-1)*0.5=-0.5<1, 损失1.5五、SVM与逻辑回归:离群点鲁棒性的本质差异
5.1 损失函数的差异
SVM和逻辑回归的核心差异在于损失函数不同:
| 模型 | 损失函数 | 数学形式 |
|---|---|---|
| 逻辑回归 | Log Loss(交叉熵) | −log(σ(y⋅z)) |
| SVM | Hinge Loss | max(0,1−y⋅z) |
其中 z=wTx+b,σ 是 Sigmoid 函数。
5.2 为什么SVM对离群点更鲁棒?
Log Loss(逻辑回归)的特性:
- 即使样本被正确分类且距离超平面很远,Log Loss 仍然会持续减小(但不会到零)
- 这意味着每个样本都对模型有影响,离群点会持续“拉扯”决策边界
- 逻辑回归对噪声和异常点比较敏感,容易过拟合
Hinge Loss(SVM)的特性:
- 一旦样本满足 yi(wTxi+b)≥1,损失直接降为 0
- 这意味着远离决策边界的样本对模型完全没有影响
- 只有支持向量(位于间隔边界上或间隔内的样本)才决定决策边界
- SVM在决策边界附近的支持向量上更加鲁棒,对噪声的容忍性更好
5.3 几何直觉
可以这样理解两者的差异:
-
逻辑回归像一个完美主义者:每个样本都在尽力“说服”决策边界向自己这边移动。即使一个点已经离边界很远,它仍然在施加影响。一个极端的离群点会把决策边界向自己这边“拉”很远。
-
SVM像一个实用主义者:它只关心“临界地带”的样本。一旦一个样本离边界足够远(超过间隔),SVM就说“你安全了,我不再管你了”。因此,远离边界的离群点根本不影响SVM的决策边界。
5.4 惩罚参数C的作用
SVM的鲁棒性可以通过参数 C 进一步调节:
- 较小的 C :允许更多样本违反间隔约束,对离群点更宽容,决策边界更平滑
- 较大的 C :强迫更多样本满足约束,对离群点更敏感,决策边界更曲折
1from sklearn.svm import SVC2from sklearn.linear_model import LogisticRegression3from sklearn.datasets import make_classification4import matplotlib.pyplot as plt5
6# 生成包含离群点的数据7np.random.seed(42)8X, y = make_classification(n_samples=100, n_features=2, n_redundant=0,9 n_clusters_per_class=1, random_state=42)10# 添加一个离群点11X_outlier = np.array([[3.5, -2.5]])12y_outlier = np.array([1])13X_aug = np.vstack([X, X_outlier])14y_aug = np.hstack([y, y_outlier])15
16# 训练逻辑回归和SVM17lr = LogisticRegression(C=1.0)18svm = SVC(kernel='linear', C=1.0)19lr.fit(X_aug, y_aug)20svm.fit(X_aug, y_aug)21
22# 打印系数差异23print("逻辑回归系数:", lr.coef_)24print("SVM系数:", svm.coef_)25# 通常SVM的决策边界受离群点影响更小5.5 总结对比
| 特性 | 逻辑回归 | SVM |
|---|---|---|
| 损失函数 | Log Loss(交叉熵) | Hinge Loss |
| 所有样本都有影响 | ✅ 是 | ❌ 否(只有支持向量有影响) |
| 对离群点敏感度 | 高 | 低 |
| 鲁棒性 | 较弱 | 较强 |
| 输出概率 | ✅ 天然输出概率 | ❌ 需要额外校准(Platt scaling) |
| 适用场景 | 需要概率解释、数据较干净 | 数据有噪声、需要强泛化能力 |
六、总结
| 概念 | 数学形式 | 核心作用 |
|---|---|---|
| 函数间隔 | γ^i=yi(wTxi+b) | 衡量分类确信度,但对缩放敏感 |
| 几何间隔 | γi=γ^i/∥w∥ | 点到超平面的真实距离,缩放不变 |
| 硬间隔原始问题 | min21∥w∥2,s.t. yi(wTxi+b)≥1 | 线性可分时的最大化间隔 |
| 硬间隔对偶问题 | max∑αi−21∑∑αiαjyiyjxiTxj,s.t. ∑αiyi=0,αi≥0 | 更易求解,引入核函数 |
| KKT条件 | 可行性 + 对偶可行性 + 互补松弛 + 梯度为零 | 原始与对偶最优解的充要条件 |
| 软间隔 | min21∥w∥2+C∑ξi,s.t. yi(wTxi+b)≥1−ξi | 处理线性不可分数据 |
| Hinge Loss | max(0,1−yi(wTxi+b)) | SVM的损失函数,产生稀疏解 |
| SVM vs LR | Hinge Loss vs Log Loss | SVM只关注支持向量,对离群点更鲁棒 |
核心要点回顾
-
函数间隔 vs 几何间隔:函数间隔对 w 和 b 的缩放敏感,而几何间隔是点到超平面的真实距离,是SVM优化的真正目标。
-
硬间隔SVM:要求所有样本满足 yi(wTxi+b)≥1,通过最大化间隔(等价于最小化 ∥w∥)找到最优超平面。
-
拉格朗日对偶:将原始问题转化为对偶问题,对偶形式中只出现样本内积 xiTxj,为核技巧铺平了道路。
-
KKT条件:互补松弛条件 αi[yi(wTxi+b)−1]=0 揭示了SVM的稀疏性——只有支持向量(αi>0)影响模型。
-
软间隔与Hinge Loss:通过松弛变量 ξi 允许部分样本违反间隔约束,等价于在L2正则化上使用Hinge Loss。参数 C 控制着间隔宽度与分类误差的权衡。
-
SVM vs 逻辑回归:SVM使用Hinge Loss,一旦样本满足间隔要求损失即为0,因此只有支持向量决定决策边界,对离群点更加鲁棒。逻辑回归使用Log Loss,所有样本都持续影响模型,对离群点更敏感。
Some information may be outdated