问题定义
支持向量机 (SVM) 是一种监督学习算法,主要用于分类和回归任务。核心问题是在特征空间中寻找一个最优超平面,使得不同类别的样本能够被最大间隔地分开,同时处理非线性可分问题。
核心算法
线性 SVM
基本原理
寻找一个超平面,使得正负样本到超平面的最小距离(间隔)最大化。支持向量是距离超平面最近的样本点,决定了超平面的位置。
超平面方程:w·x + b = 0
间隔:2/||w||
优化目标:min (1/2)||w||² s.t. y_i(w·x_i + b) ≥ 1
间隔: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
约束: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)
常见核函数:
- 线性核: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。这些参数需要通过交叉验证来选择。
交叉验证
使用网格搜索或随机搜索结合交叉验证来选择最优参数组合。
优缺点分析
优点
在高维空间中表现良好,适合小样本学习,泛化能力强,通过核函数可以处理非线性问题。
缺点
计算复杂度高,训练时间长,对大规模数据集不友好,参数调优复杂,对噪声和缺失值敏感。