Skip to content

支持向量机 (SVM)

一句话定义:SVM 是一种最大间隔分类器,它寻找一个超平面将数据分开,并使得离超平面最近的点(支持向量)到超平面的距离最大化。

为什么重要?

  • 在深度学习之前,SVM 是最强大的分类算法之一
  • 引入了核技巧 (Kernel Trick),影响了整个机器学习领域
  • 理论优美,可解释性强
  • 小数据集上仍有竞争力

想象你要在操场上用绳子把红队蓝队分开:

方案问题
随便画能分开,但绳子贴着某些人,稍微动就分错了
最大间隔让绳子离两边最近的人都尽量远,这样更稳定

支持向量 = 离绳子最近的那几个人(他们决定了绳子的位置)

如果红蓝两队混在一起(线性不可分),怎么办?

核技巧:把人”抛到空中”(升维),在空中用一个平面分开,再投影回地面。



观察决策边界如何分离两类数据,理解支持向量的作用。

📊 SVM 决策边界可视化

数据集:
++++++
正类 (+1)
负类 (-1)
支持向量
决策边界

💡 支持向量是离决策边界最近的点,它们决定了边界的位置


给定训练数据 (xi,yi)(x_i, y_i),其中 yi{1,+1}y_i \in \{-1, +1\},目标是找到超平面 wTx+b=0w^T x + b = 0

最大间隔优化目标
maxw,b2ws.t.yi(wTxi+b)1,i\begin{aligned} \max_{w,b} \quad & \frac{2}{\|w\|} \\ \text{s.t.} \quad & y_i(w^T x_i + b) \geq 1, \forall i \end{aligned}
  • 2w\frac{2}{\|w\|}: 间隔宽度(两侧支持向量之间的距离)
  • 约束条件:所有点都被正确分类且在间隔之外
  • 等价于最小化 12w2\frac{1}{2}\|w\|^2

现实数据通常有噪声,允许一些错误分类:

软间隔 SVM
minw,b,ξ12w2+Ci=1nξi\min_{w,b,\xi} \frac{1}{2}\|w\|^2 + C\sum_{i=1}^n \xi_i
  • ξi\xi_i: 松弛变量,允许点进入间隔或被错分
  • CC: 惩罚系数,越大对错误越不容忍
  • CC \to \infty: 硬间隔 SVM
  • C0C \to 0: 忽略错误,间隔最大

核心思想:不显式计算高维映射 ϕ(x)\phi(x),而是用核函数直接计算内积。

核函数定义
K(xi,xj)=ϕ(xi)Tϕ(xj)K(x_i, x_j) = \phi(x_i)^T \phi(x_j)

常用核函数:

  • 线性核: K(x,z)=xTzK(x,z) = x^T z
  • 多项式核: K(x,z)=(xTz+c)dK(x,z) = (x^T z + c)^d
  • RBF (高斯核): K(x,z)=exp(γxz2)K(x,z) = \exp(-\gamma\|x-z\|^2)
  • Sigmoid 核: K(x,z)=tanh(αxTz+c)K(x,z) = \tanh(\alpha x^T z + c)

RBF 核相当于将数据映射到无限维空间,但计算复杂度仍然有限!


from sklearn import svm
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 生成数据
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 线性 SVM
linear_svm = svm.SVC(kernel='linear', C=1.0)
linear_svm.fit(X_train, y_train)
print(f"线性 SVM 准确率: {accuracy_score(y_test, linear_svm.predict(X_test)):.3f}")
# RBF 核 SVM
rbf_svm = svm.SVC(kernel='rbf', C=1.0, gamma='scale')
rbf_svm.fit(X_train, y_train)
print(f"RBF SVM 准确率: {accuracy_score(y_test, rbf_svm.predict(X_test)):.3f}")
# 查看支持向量数量
print(f"支持向量数量: {len(rbf_svm.support_vectors_)}")

特性SVM逻辑回归神经网络决策树
小数据集✅✅ 最佳✅ 好❌ 易过拟合✅ 好
高维数据✅✅ 擅长✅ 好✅ 好⚠️ 一般
非线性✅ 核技巧❌ 需特征工程✅✅ 天然支持✅ 天然支持
可解释性✅ 支持向量✅ 权重❌ 黑箱✅✅ 规则
大数据集❌ 慢✅ 快✅ 快(GPU)✅ 快

参数作用调参建议
C惩罚系数过拟合时减小,欠拟合时增大
kernel核函数类型先试 RBF,不行再试其他
gammaRBF 核宽度大=复杂边界,小=平滑边界

  1. 集成学习 - Random Forest, XGBoost
  2. 逻辑回归 - 更简单的分类器
  3. 神经网络 - 深度学习基础