共计 2291 个字符,预计需要花费 6 分钟才能阅读完成。
支持向量机(Support Vector Machine, SVM)是一种强大的监督学习算法,特别适合处理中小规模数据集的分类问题。它在文本分类、图像识别、生物信息学等领域都有广泛应用。与逻辑回归等传统算法相比,SVM 在高维空间中表现尤为出色,能够有效处理非线性分类问题。

数学原理
1. 硬间隔与软间隔
SVM 的核心思想是找到一个最优超平面,使得两类数据点之间的间隔(margin)最大化。对于线性可分的数据,我们可以使用硬间隔分类器:
minimize 1/2 ||w||^2
subject to y_i(w·x_i + b) ≥ 1, ∀i
其中 w 是超平面的法向量,b 是偏置项,y_i 是样本标签(±1)。
对于线性不可分的数据,我们引入松弛变量 ξ_i,得到软间隔分类器:
minimize 1/2 ||w||^2 + C∑ξ_i
subject to y_i(w·x_i + b) ≥ 1-ξ_i, ξ_i ≥ 0
这里的 C 是惩罚参数,控制对错误分类的容忍度。
2. 核函数技巧
当数据不是线性可分时,我们可以通过核函数将数据映射到高维空间。常用核函数包括:
- 线性核:K(x_i, x_j) = x_i·x_j
- 多项式核:K(x_i, x_j) = (γx_i·x_j + r)^d
- RBF 核(高斯核):K(x_i, x_j) = exp(-γ||x_i – x_j||^2)
3. 对偶问题转换
通过拉格朗日乘子法,原始优化问题可以转化为对偶问题:
maximize ∑α_i - 1/2 ∑∑α_iα_jy_iy_jK(x_i,x_j)
subject to 0 ≤ α_i ≤ C, ∑α_iy_i = 0
这个转换减少了计算复杂度,并且使核函数技巧成为可能。
Python 实战
1. 数据准备与预处理
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
# 生成非线性可分数据
X, y = make_moons(n_samples=100, noise=0.1, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
2. 模型训练与评估
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3)
# 创建 SVM 模型
svm = SVC(kernel='rbf', C=1.0, gamma='scale')
svm.fit(X_train, y_train)
# 评估
print(classification_report(y_test, svm.predict(X_test)))
3. 可视化决策边界
import matplotlib.pyplot as plt
import numpy as np
# 创建网格点
xx, yy = np.meshgrid(np.linspace(-2, 2, 100), np.linspace(-2, 2, 100))
Z = svm.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
# 绘制结果
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X[:,0], X[:,1], c=y, edgecolors='k')
plt.title('SVM Decision Boundary')
plt.show()
4. 超参数调优
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {'C': [0.1, 1, 10, 100],
'gamma': [1, 0.1, 0.01, 0.001],
'kernel': ['rbf', 'poly', 'sigmoid']
}
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=2)
grid.fit(X_train, y_train)
# 最优参数
print(f"Best parameters: {grid.best_params_}")
避坑指南
1. 样本不平衡处理
- 使用 class_weight 参数调整类别权重
- 对少数类进行过采样或多数类进行欠采样
- 考虑使用 SVC 的 class_weight=’balanced’ 选项
2. 核函数选择策略
- 线性核:数据量很大或特征维度很高时
- RBF 核:默认选择,适用于大多数情况
- 多项式核:当特征之间明显存在多项式关系时
3. 大规模数据优化
- 使用 LinearSVC 替代 SVC 处理线性问题
- 减小核缓存大小(cache_size)
- 考虑使用随机梯度下降的 SGDClassifier
- 使用近似算法如 Nystroem 方法
思考与延伸
- SVM 与神经网络在文本分类中的优劣对比:
- SVM 在小样本上表现更好,训练更快
-
神经网络需要更多数据但可以自动学习特征
-
如何设计自定义核函数:
- 确保核函数满足 Mercer 条件(正定)
-
考虑领域知识和数据特性
-
在线学习场景下的 SVM 改进方案:
- 使用增量学习算法
- 考虑预算感知的 SVM 变种
- 定期重新训练模型
通过本文的学习,你应该已经掌握了 SVM 的核心原理和实际应用方法。SVM 是一个强大而灵活的算法,虽然深度学习在很多领域占据了主导地位,但 SVM 仍然在中小规模数据集上有着不可替代的优势。
正文完
发表至: 未分类
近一天内
