支持向量机(SVM)原理详解与Python实战:从线性可分到核技巧

1次阅读
没有评论

共计 1324 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

背景痛点

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

支持向量机 (SVM) 原理详解与 Python 实战:从线性可分到核技巧

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)

生产建议

  1. 大数据场景:对于特征数远大于样本数的情况,使用线性核效率更高
  2. 类别不平衡:设置 class_weight=’balanced’ 自动调整类别权重
  3. 与深度学习对比:样本量少时 SVM 更优,数据量大且特征复杂时深度学习可能更好

延伸思考

  1. 尝试实现自定义核函数,比如字符串核或图核
  2. 研究 SMO(序列最小优化)算法,理解 SVM 的求解过程
  3. 探索 SVM 在回归问题 (SVR) 中的应用
正文完
 0
评论(没有评论)