Day 12:支持向量机(SVM)原理与实践
📋 目录
- SVM 概述与发展
- 线性可分 SVM(硬间隔)
- 线性不可分 SVM(软间隔)
- 核方法(Kernel Trick)
- SVM 超参数详解
- SVM 优缺点与应用场景
第一部分:SVM 概述与发展
1.1 什么是 SVM?
支持向量机(Support Vector Machine, SVM) 是一种监督学习 模型,通过寻找最大间隔超平面来区分不同类别的数据。
核心思想:
找到离决策边界最近的样本点(支持向量),并最大化它们到边界的距离。
1.2 SVM 的发展历程
| 时间 | 里程碑 | 贡献者 |
|---|---|---|
| 1963年 | 线性可分 SVM(硬间隔) | Vladimir Vapnik 等 |
| 1992年 | 核技巧(Kernel Trick) | Bernhard Boser 等 |
| 1995年 | 软间隔(Soft Margin) | Corinna Cortes 等 |
重要地位:被誉为"最好的现成分类器",在深度学习兴起前是机器学习的主流算法。
1.3 SVM vs 其他分类器
| 特性 | 逻辑回归 | KNN | 决策树 | SVM |
|---|---|---|---|---|
| 决策边界 | 线性 | 非线性 | 分段线性 | 线性/非线性 |
| 对异常值敏感度 | 中 | 高 | 低 | 低 |
| 高维数据表现 | 好 | 差 | 中 | 优秀 |
| 可解释性 | 高 | 中 | 高 | 低 |
| 训练速度 | 快 | 快 | 快 | 慢(大数据) |
第二部分:线性可分 SVM(硬间隔)
2.1 基本概念
线性可分:存在一个超平面能够完全分开两类数据点。
超平面方程 :
wTx+b=0 \mathbf{w}^T \mathbf{x} + b = 0 wTx+b=0
其中:
- w\mathbf{w}w:法向量(决定方向)
- bbb:偏置(决定位置)
分类决策函数 :
f(x)=sign(wTx+b) f(\mathbf{x}) = \operatorname{sign}(\mathbf{w}^T \mathbf{x} + b) f(x)=sign(wTx+b)
2.2 函数间隔与几何间隔
函数间隔 :
γ^i=yi(wTxi+b) \hat{\gamma}_i = y_i(\mathbf{w}^T \mathbf{x}_i + b) γ^i=yi(wTxi+b)
几何间隔 (点到超平面的真实距离):
γi=yi(wTxi+b)∥w∥=γ^i∥w∥ \gamma_i = \frac{y_i(\mathbf{w}^T \mathbf{x}_i + b)}{\|\mathbf{w}\|} = \frac{\hat{\gamma}_i}{\|\mathbf{w}\|} γi=∥w∥yi(wTxi+b)=∥w∥γ^i
数据集的最小几何间隔 :
γ=mini=1,...,nγi \gamma = \min_{i=1,\dots,n} \gamma_i γ=i=1,...,nminγi
2.3 最大间隔原理
目标 :找到使几何间隔 γ\gammaγ 最大的超平面。
优化问题 :
maxw,bγs.t.yi(wTxi+b)∥w∥≥γ,i=1,...,n \max_{\mathbf{w}, b} \gamma \quad \text{s.t.} \quad \frac{y_i(\mathbf{w}^T \mathbf{x}_i + b)}{\|\mathbf{w}\|} \geq \gamma, \quad i = 1, \dots, n w,bmaxγs.t.∥w∥yi(wTxi+b)≥γ,i=1,...,n
等价形式 (令 γ^=1\hat{\gamma} = 1γ^=1):
minw,b12∥w∥2s.t.yi(wTxi+b)≥1,i=1,...,n \min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 \quad \text{s.t.} \quad y_i(\mathbf{w}^T \mathbf{x}_i + b) \geq 1, \quad i = 1, \dots, n w,bmin21∥w∥2s.t.yi(wTxi+b)≥1,i=1,...,n
2.4 支持向量
定义 :距离决策边界最近的样本点,即满足 yi(wTxi+b)=1y_i(\mathbf{w}^T \mathbf{x}_i + b) = 1yi(wTxi+b)=1 的点。
性质:
- 只有支持向量决定决策边界
- 移除非支持向量不影响模型
第三部分:线性不可分 SVM(软间隔)
3.1 为什么要软间隔?
硬间隔的问题:
- 数据可能线性不可分(不存在完美分隔的超平面)
- 即使线性可分,硬间隔对异常值极其敏感
3.2 软间隔的引入
松弛变量 ξi\xi_iξi :
ξi=max(0,1−yi(wTxi+b)) \xi_i = \max(0, 1 - y_i(\mathbf{w}^T\mathbf{x}_i + b)) ξi=max(0,1−yi(wTxi+b))
含义:
- ξi=0\xi_i = 0ξi=0:正确分类且在间隔外
- 0<ξi<10 < \xi_i < 10<ξi<1:正确分类但在间隔内
- ξi≥1\xi_i \geq 1ξi≥1:分类错误
3.3 C 参数(惩罚系数)
优化目标 :
minw,b,ξ12∥w∥2+C∑i=1nξi \min_{\mathbf{w}, b, \xi} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^n \xi_i w,b,ξmin21∥w∥2+Ci=1∑nξi
约束条件 :
yi(wTxi+b)≥1−ξi,ξi≥0,i=1,...,n y_i(\mathbf{w}^T \mathbf{x}_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad i = 1, \dots, n yi(wTxi+b)≥1−ξi,ξi≥0,i=1,...,n
3.4 C 参数的影响
| C 值 | 效果 | 风险 |
|---|---|---|
| 大 C | 更关注分类正确,允许更小的间隔 | 过拟合 |
| 小 C | 更关注间隔最大化,允许更多误分类 | 欠拟合 |
调参经验:
- C 过大 → 训练集准确率高,测试集可能低(过拟合)
- C 过小 → 训练集准确率低(欠拟合)
- 通常使用对数尺度搜索:
[0.001, 0.01, 0.1, 1, 10, 100]
第四部分:核方法(Kernel Trick)
4.1 为什么需要核函数?
问题 :很多真实数据在原始特征空间是线性不可分的。
解决方案 :将数据映射到高维特征空间,使其变得线性可分。
python
# 一维线性不可分 → 二维线性可分
# 原始空间: x (一维)
# 映射到: φ(x) = [x, x²] (二维)
4.2 核函数定义
核函数 :K(xi,xj)=ϕ(xi)Tϕ(xj)K(\mathbf{x}_i, \mathbf{x}_j) = \phi(\mathbf{x}_i)^T \phi(\mathbf{x}_j)K(xi,xj)=ϕ(xi)Tϕ(xj)
核技巧 :不需要显式计算高维映射 ϕ\phiϕ,直接计算内积,大大降低计算量。
4.3 常用核函数
| 核函数 | 公式 | 参数 | 特点 |
|---|---|---|---|
| 线性核 | K(xi,xj)=xiTxjK(x_i, x_j) = x_i^T x_jK(xi,xj)=xiTxj | - | 速度快,可解释 |
| 多项式核 | K(xi,xj)=(γxiTxj+r)dK(x_i, x_j) = (\gamma x_i^T x_j + r)^dK(xi,xj)=(γxiTxj+r)d | degree, coef0 |
全局性强 |
| RBF核 | K(xi,xj)=exp(−γ∣xi−xj∣2)K(x_i, x_j) = \exp(-\gamma |x_i - x_j|^2)K(xi,xj)=exp(−γ∣xi−xj∣2) | gamma |
局部性强,最常用 |
| Sigmoid核 | K(xi,xj)=tanh(γxiTxj+r)K(x_i, x_j) = \tanh(\gamma x_i^T x_j + r)K(xi,xj)=tanh(γxiTxj+r) | gamma, coef0 |
类似神经网络 |
4.4 RBF 核详解
RBF (Radial Basis Function) 是最常用的核函数,又称高斯核。
公式 :
K(xi,xj)=exp(−γ∥xi−xj∥2) K(x_i, x_j) = \exp(-\gamma \|x_i - x_j\|^2) K(xi,xj)=exp(−γ∥xi−xj∥2)
参数 γ\gammaγ 的影响:
| γ\gammaγ | 效果 | 风险 |
|---|---|---|
| 大 | 影响范围小,决策边界复杂 | 过拟合 |
| 小 | 影响范围大,决策边界平滑 | 欠拟合 |
RBF 核的优势:
- 只有一个参数 γ\gammaγ,调参简单
- 能逼近任意连续函数
- 数值稳定性好
第五部分:SVM 超参数详解
5.1 核心参数
| 参数 | 含义 | 典型范围 | 调参建议 |
|---|---|---|---|
C |
惩罚系数 | [0.001, 0.01, 0.1, 1, 10, 100] | 对数尺度 |
gamma |
RBF 核参数 | [0.001, 0.01, 0.1, 1, 10] | 对数尺度 |
kernel |
核函数类型 | 'linear', 'rbf', 'poly' | 优先尝试 linear, rbf |
degree |
多项式核次数 | 2, 3, 4, 5 | 与 kernel='poly' 配合 |
5.2 参数交互
text
C 大 + gamma 大 = 复杂边界(过拟合风险高)
C 小 + gamma 小 = 平滑边界(欠拟合风险高)
C 大 + gamma 小 = 间隔小但平滑
C 小 + gamma 大 = 间隔大但复杂
5.3 数据预处理
SVM 对特征缩放极其敏感,必须进行标准化!
python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
原因:SVM 基于距离计算,不同量纲的特征会主导决策边界。
第六部分:SVM 优缺点与应用场景
6.1 优点
| 优点 | 说明 |
|---|---|
| 高维有效 | 特征维度 > 样本数时表现好 |
| 内存高效 | 只使用支持向量 |
| 鲁棒性强 | 对异常值不敏感 |
| 核技巧 | 处理非线性问题 |
6.2 缺点
| 缺点 | 说明 |
|---|---|
| 计算量大 | O(n2)O(n^2)O(n2) 到 O(n3)O(n^3)O(n3) |
| 解释性差 | 核映射后难以解释 |
| 参数敏感 | C 和 gamma 需要仔细调参 |
| 概率输出差 | 不如逻辑回归自然 |
6.3 量化交易应用场景
| 场景 | 适用性 | 说明 |
|---|---|---|
| 涨跌预测 | 中等 | 需要调参,特征标准化 |
| 市场状态分类 | 较好 | 区分牛/熊/震荡 |
| 配对交易 | 较好 | 识别价格背离 |
| 高频交易 | 差 | 训练速度慢 |