机器学习基础:支持向量机

1. 引言

支持向量机(Support Vector Machine, SVM)是一种经典的监督学习算法,由 Vapnik 等人在 1990 年代提出。SVM 在分类和回归任务中表现优异,尤其在高维空间和小样本数据集上具有显著优势。本文将从基本原理、数学推导、核函数技巧到实际应用,系统介绍 SVM 的核心概念。

2. 基本思想

2.1 线性可分问题

假设我们有一个二分类问题,训练数据集为:

D={(x1,y1),(x2,y2),...,(xn,yn)}D = \{(\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), ..., (\mathbf{x}_n, y_n)\}D={(x1,y1),(x2,y2),...,(xn,yn)}

其中 xi∈Rd\mathbf{x}_i \in \mathbb{R}^dxiRd 是特征向量,yi∈{−1,+1}y_i \in \{-1, +1\}yi{1,+1} 是类别标签。

SVM 的目标是找到一个超平面(hyperplane)将两类样本分开:

wTx+b=0\mathbf{w}^T\mathbf{x} + b = 0wTx+b=0

其中 w\mathbf{w}w 是法向量,bbb 是偏置项。

2.2 最大间隔原则

SVM 的核心思想是最大化分类间隔(margin)。间隔定义为两类样本到超平面的最小距离之和。

xi\mathbf{x}_ixi 到超平面的距离为:

di=∣wTxi+b∣∣∣w∣∣d_i = \frac{|{\mathbf{w}^T\mathbf{x}_i + b}|}{||\mathbf{w}||}di=∣∣w∣∣wTxi+b

为了使所有样本正确分类,需满足:

yi(wTxi+b)≥1,∀iy_i(\mathbf{w}^T\mathbf{x}_i + b) \geq 1, \quad \forall iyi(wTxi+b)1,i

此时,间隔为 γ=2∣∣w∣∣\gamma = \frac{2}{||\mathbf{w}||}γ=∣∣w∣∣2,最大化间隔等价于最小化 ∣∣w∣∣2||\mathbf{w}||^2∣∣w2

3. 数学建模

3.1 原始问题(Primal Problem)

SVM 的优化目标可表述为:

min⁡w,b12∣∣w∣∣2\min_{\mathbf{w}, b} \frac{1}{2}||\mathbf{w}||^2w,bmin21∣∣w2

s.t.yi(wTxi+b)≥1,i=1,2,...,n\text{s.t.} \quad y_i(\mathbf{w}^T\mathbf{x}_i + b) \geq 1, \quad i = 1, 2, ..., ns.t.yi(wTxi+b)1,i=1,2,...,n

这是一个凸二次规划问题。

3.2 对偶问题(Dual Problem)

引入拉格朗日乘子 αi≥0\alpha_i \geq 0αi0,构造拉格朗日函数:

L(w,b,α)=12∣∣w∣∣2−∑i=1nαi[yi(wTxi+b)−1]L(\mathbf{w}, b, \boldsymbol{\alpha}) = \frac{1}{2}||\mathbf{w}||^2 - \sum_{i=1}^{n}\alpha_i[y_i(\mathbf{w}^T\mathbf{x}_i + b) - 1]L(w,b,α)=21∣∣w2i=1nαi[yi(wTxi+b)1]

w\mathbf{w}wbbb 求偏导并令其为零:

∂L∂w=0⇒w=∑i=1nαiyixi\frac{\partial L}{\partial \mathbf{w}} = 0 \Rightarrow \mathbf{w} = \sum_{i=1}^{n}\alpha_i y_i \mathbf{x}_iwL=0w=i=1nαiyixi

∂L∂b=0⇒∑i=1nαiyi=0\frac{\partial L}{\partial b} = 0 \Rightarrow \sum_{i=1}^{n}\alpha_i y_i = 0bL=0i=1nαiyi=0

代入得对偶问题:

max⁡α∑i=1nαi−12∑i=1n∑j=1nαiαjyiyjxiTxj\max_{\boldsymbol{\alpha}} \sum_{i=1}^{n}\alpha_i - \frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha_i\alpha_j y_i y_j \mathbf{x}_i^T\mathbf{x}_jαmaxi=1nαi21i=1nj=1nαiαjyiyjxiTxj

s.t.αi≥0,∑i=1nαiyi=0\text{s.t.} \quad \alpha_i \geq 0, \quad \sum_{i=1}^{n}\alpha_i y_i = 0s.t.αi0,i=1nαiyi=0

3.3 支持向量

根据 KKT 条件,只有满足 αi>0\alpha_i > 0αi>0 的样本点才对决策边界有贡献,这些点称为支持向量(Support Vectors)。支持向量位于间隔边界上,即满足 yi(wTxi+b)=1y_i(\mathbf{w}^T\mathbf{x}_i + b) = 1yi(wTxi+b)=1

4. 软间隔与正则化

4.1 软间隔 SVM

实际数据往往存在噪声或线性不可分的情况。引入松弛变量 ξi≥0\xi_i \geq 0ξi0 允许部分样本违反约束:

min⁡w,b,ξ12∣∣w∣∣2+C∑i=1nξi\min_{\mathbf{w}, b, \boldsymbol{\xi}} \frac{1}{2}||\mathbf{w}||^2 + C\sum_{i=1}^{n}\xi_iw,b,ξmin21∣∣w2+Ci=1nξi

s.t.yi(wTxi+b)≥1−ξi,ξi≥0\text{s.t.} \quad y_i(\mathbf{w}^T\mathbf{x}_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0s.t.yi(wTxi+b)1ξi,ξi0

参数 C>0C > 0C>0 控制对误分类的惩罚程度:

  • CCC 较大:对误分类惩罚严重,间隔较小
  • CCC 较小:允许更多误分类,间隔较大

4.2 Hinge Loss

软间隔 SVM 等价于最小化 Hinge 损失:

min⁡w,b12∣∣w∣∣2+C∑i=1nmax⁡(0,1−yi(wTxi+b))\min_{\mathbf{w}, b} \frac{1}{2}||\mathbf{w}||^2 + C\sum_{i=1}^{n}\max(0, 1 - y_i(\mathbf{w}^T\mathbf{x}_i + b))w,bmin21∣∣w2+Ci=1nmax(0,1yi(wTxi+b))

5. 核函数技巧

5.1 非线性映射

对于线性不可分问题,可将数据映射到高维特征空间:

ϕ:Rd→RD,D>>d\phi: \mathbb{R}^d \rightarrow \mathbb{R}^D, \quad D >> dϕ:RdRD,D>>d

在高维空间中寻找线性超平面。

5.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) 可以隐式计算高维内积,避免显式映射的计算开销。

对偶问题变为:

max⁡α∑i=1nαi−12∑i=1n∑j=1nαiαjyiyjK(xi,xj)\max_{\boldsymbol{\alpha}} \sum_{i=1}^{n}\alpha_i - \frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha_i\alpha_j y_i y_j K(\mathbf{x}_i, \mathbf{x}_j)αmaxi=1nαi21i=1nj=1nαiαjyiyjK(xi,xj)

5.3 常用核函数

核函数表达式特点
线性核K(x,z)=xTzK(\mathbf{x}, \mathbf{z}) = \mathbf{x}^T\mathbf{z}K(x,z)=xTz适用于线性可分数据
多项式核K(x,z)=(γxTz+r)dK(\mathbf{x}, \mathbf{z}) = (\gamma\mathbf{x}^T\mathbf{z} + r)^dK(x,z)=(γxTz+r)d可学习特征交互
RBF(高斯)核K(x,z)=exp⁡(−γ∣x−z∣2)K(\mathbf{x}, \mathbf{z}) = \exp(-\gamma |\mathbf{x}-\mathbf{z}|^2)K(x,z)=exp(γxz2)最常用,可映射到无限维
Sigmoid 核K(x,z)=tanh⁡(γxTz+r)K(\mathbf{x}, \mathbf{z}) = \tanh(\gamma\mathbf{x}^T\mathbf{z} + r)K(x,z)=tanh(γxTz+r)类似神经网络

5.4 核函数选择建议

  1. 特征数量 >> 样本数量:使用线性核
  2. 特征数量较少,样本适中:使用 RBF 核
  3. 特征数量较少,样本很大:先尝试线性核,再考虑 RBF

6. SMO 算法

序列最小优化(Sequential Minimal Optimization, SMO)是求解 SVM 对偶问题的高效算法,由 John Platt 于 1998 年提出。

6.1 基本思想

每次选择两个变量 αi,αj\alpha_i, \alpha_jαi,αj 进行优化,固定其他变量。由于约束 ∑kαkyk=0\sum_k \alpha_k y_k = 0kαkyk=0,两个变量的更新可以解析求解。

6.2 变量选择策略

  1. 外层循环:选择违反 KKT 条件最严重的 αi\alpha_iαi
  2. 内层循环:选择使目标函数下降最快的 αj\alpha_jαj

7. 多分类扩展

SVM 原生支持二分类,多分类问题可通过以下策略解决:

7.1 一对一(One-vs-One, OvO)

  • 训练 k(k−1)2\frac{k(k-1)}{2}2k(k1) 个分类器
  • 预测时投票决定类别
  • 优点:每个分类器训练数据少,速度快

7.2 一对多(One-vs-Rest, OvR)

  • 训练 kkk 个分类器,每个区分一类与其他类
  • 预测时选择置信度最高的类别
  • 优点:分类器数量少

8. Python 实现示例

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
from sklearn.preprocessing import StandardScaler

# 加载数据
iris = datasets.load_iris()
X, y = iris.data, iris.target

# 数据预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, test_size=0.3, random_state=42
)

# 训练 SVM 模型
svm_model = SVC(
    kernel='rbf',      # 使用 RBF 核
    C=1.0,             # 正则化参数
    gamma='scale',     # 核系数
    random_state=42
)
svm_model.fit(X_train, y_train)

# 预测与评估
y_pred = svm_model.predict(X_test)
print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 查看支持向量
print(f"\n支持向量数量: {svm_model.n_support_}")
print(f"支持向量索引: {svm_model.support_[:10]}...")  # 前10个

运行结果如下:
在这里插入图片描述

8.2 参数调优

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'C': [0.1, 1, 10, 100],
    'gamma': ['scale', 'auto', 0.1, 0.01],
    'kernel': ['rbf', 'linear', 'poly']
}

# 网格搜索
grid_search = GridSearchCV(
    SVC(), param_grid, cv=5, scoring='accuracy', n_jobs=-1
)
grid_search.fit(X_train, y_train)

print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.4f}")

运行结果:在这里插入图片描述

9. SVM 的优缺点

9.1 优点

  • 高维有效:在高维空间表现良好,适合文本分类等任务
  • 内存高效:只需存储支持向量
  • 泛化能力强:最大间隔原则提供良好的泛化性能
  • 核技巧灵活:可处理非线性问题

9.2 缺点

  • 大规模数据慢:时间复杂度 O(n2)O(n^2)O(n2)O(n3)O(n^3)O(n3)
  • 对噪声敏感:异常点可能成为支持向量
  • 参数选择困难CCC 和核参数需要仔细调优
  • 不直接输出概率:需要额外计算(如 Platt Scaling)

10. 应用场景

领域应用
文本分类垃圾邮件检测、情感分析
图像识别人脸识别、手写数字识别
生物信息学蛋白质分类、基因表达分析
金融信用评分、欺诈检测
医学疾病诊断、医学图像分析

11. 总结

支持向量机是机器学习中的经典算法,其核心思想是通过最大化分类间隔来获得良好的泛化能力。通过核技巧,SVM 可以有效处理非线性问题。虽然深度学习在许多任务上取得了更好的效果,但 SVM 在小样本、高维数据和可解释性要求高的场景中仍然是重要的选择。

更多推荐