共计 1324 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
在机器学习分类任务中,我们常常遇到线性不可分的数据。比如二维平面上环形分布的数据点,用一条直线无论如何也无法完美分开两类样本。传统的逻辑回归等线性模型在这种情况下表现不佳,这就是我们需要支持向量机 (SVM) 的原因。

SVM 的核心思想是通过几何间隔最大化来寻找最优分类超平面。即使数据在原始空间线性不可分,也可以通过核技巧映射到高维空间使其线性可分。这种思想让 SVM 在处理小样本、高维数据时表现出色。
原理剖析
1. 硬间隔 SVM
对于线性可分数据,SVM 试图找到一个超平面,使得两类样本到这个超平面的最小距离 (即间隔) 最大。数学上可以表示为:
min 1/2||w||²
s.t. y_i(w·x_i + b) ≥ 1, ∀i
通过拉格朗日对偶转换,我们可以得到对偶问题:
max Σα_i - 1/2ΣΣα_iα_jy_iy_jx_i·x_j
s.t. Σα_iy_i = 0, α_i ≥ 0
2. 软间隔 SVM
现实数据往往有噪声,我们引入松弛变量 ξ 允许一些样本违反约束:
min 1/2||w||² + CΣξ_i
s.t. y_i(w·x_i + b) ≥ 1-ξ_i, ξ_i ≥ 0
这里的 C 是惩罚系数,控制对误分类的容忍程度。
3. 核技巧
对于非线性问题,我们通过核函数 K(x_i,x_j) = φ(x_i)·φ(x_j)将数据映射到高维空间。常用的核函数包括:
- 线性核:K(x,y) = x·y
- 多项式核:K(x,y) = (γx·y + r)^d
- RBF 核:K(x,y) = exp(-γ||x-y||²)
代码实战
1. 数据准备
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
X = StandardScaler().fit_transform(X)
2. 线性 SVM
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10, 100]}
svc = SVC(kernel='linear')
grid_search = GridSearchCV(svc, param_grid, cv=5)
grid_search.fit(X, y)
3. RBF 核 SVM
param_grid = {'C': [0.1, 1, 10, 100],
'gamma': [0.01, 0.1, 1, 10]
}
rbf_svc = SVC(kernel='rbf')
grid_search = GridSearchCV(rbf_svc, param_grid, cv=5)
grid_search.fit(X, y)
生产建议
- 大数据场景:对于特征数远大于样本数的情况,使用线性核效率更高
- 类别不平衡:设置 class_weight=’balanced’ 自动调整类别权重
- 与深度学习对比:样本量少时 SVM 更优,数据量大且特征复杂时深度学习可能更好
延伸思考
- 尝试实现自定义核函数,比如字符串核或图核
- 研究 SMO(序列最小优化)算法,理解 SVM 的求解过程
- 探索 SVM 在回归问题 (SVR) 中的应用
正文完
发表至: 未分类
近两天内
