支持向量机

SVM · Kernel Method · Maximum Margin

问题定义

支持向量机 (SVM) 是一种监督学习算法,主要用于分类和回归任务。核心问题是在特征空间中寻找一个最优超平面,使得不同类别的样本能够被最大间隔地分开,同时处理非线性可分问题。

核心算法

线性 SVM

基本原理

寻找一个超平面,使得正负样本到超平面的最小距离(间隔)最大化。支持向量是距离超平面最近的样本点,决定了超平面的位置。

超平面方程:w·x + b = 0
间隔:2/||w||
优化目标:min (1/2)||w||² s.t. y_i(w·x_i + b) ≥ 1

软间隔 SVM

基本原理

允许一些样本被错误分类,通过引入松弛变量来处理噪声和非线性可分情况。

优化目标:min (1/2)||w||² + CΣξ_i
约束:y_i(w·x_i + b) ≥ 1 - ξ_i, ξ_i ≥ 0

核函数

基本原理

通过核函数将低维输入空间映射到高维特征空间,使得原本非线性可分的问题在高维空间中线性可分。

核函数:K(x, x') = φ(x)·φ(x')
常见核函数:
- 线性核:K(x, x') = x·x'
- 多项式核:K(x, x') = (x·x' + c)^d
- RBF 核:K(x, x') = exp(-γ||x - x'||²)
- Sigmoid 核:K(x, x') = tanh(αx·x' + c)

求解方法

对偶问题

通过 Lagrange 乘数法将原问题转化为对偶问题,利用 SMO(序列最小优化)算法求解。

SMO 算法

将大优化问题分解为多个小优化问题,每次只优化两个 Lagrange 乘子,提高计算效率。

开源实现

scikit-learn SVM

提供 SVC、NuSVC、LinearSVC、SVR、NuSVR、LinearSVR 等实现,支持线性和非线性核函数。

LIBSVM

经典的 SVM 实现库,提供 C++、Java、Python 等多语言接口,支持分类、回归和分布估计。

SVM-light

快速的 SVM 实现,特别适合处理大规模数据集。

Vowpal Wabbit

支持在线学习的 SVM 实现,适用于大规模机器学习任务。

应用场景

参数调优

正则化参数 C

控制惩罚系数,C 越大,对错误分类的惩罚越重,模型越复杂,容易过拟合;C 越小,模型越简单,容易欠拟合。

核函数参数

多项式核:d(次数);RBF 核:γ( gamma );Sigmoid 核:α 和 c。这些参数需要通过交叉验证来选择。

交叉验证

使用网格搜索或随机搜索结合交叉验证来选择最优参数组合。

优缺点分析

优点

在高维空间中表现良好,适合小样本学习,泛化能力强,通过核函数可以处理非线性问题。

缺点

计算复杂度高,训练时间长,对大规模数据集不友好,参数调优复杂,对噪声和缺失值敏感。

参考文献