支持向量机(SVM)完整解析:原理 + 推导 + 核方法 + 实战

发布于:2025-07-30 ⋅ 阅读:(25) ⋅ 点赞:(0)

1️⃣ 什么是支持向量机?

支持向量机(Support Vector Machine,SVM)是一种经典的监督学习算法,广泛应用于二分类任务,也可扩展至多分类和回归(SVR)。

核心目标:

找到一个最优的超平面,最大化两类样本间隔,从而提升分类的鲁棒性。

2️⃣ 基本思想

  • 给定一组样本数据 (x_{i},y_{i}),其中 y_{i}\in \left \{ -1,+1 \right \}

  • 寻找一个超平面:\mathbf{w}^\top \mathbf{x} + b = 0 

  • 使得两类数据点尽量远离超平面,且间隔最大。

3️⃣ 硬间隔最大化(Hard Margin)

3.1 分类约束条件

对于线性可分数据,要求:

y_i(\mathbf{w}^\top \mathbf{x}_i + b) \ge 1, \quad i = 1,2,...,m 

3.2 间隔定义

两类支持向量到超平面的距离为:

\text{margin} = \frac{2}{\|\mathbf{w}\|} 

3.3 优化目标

最大化间隔等价于最小化 | |\mathbf{w}\|^2

\min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 \quad s.t. \quad y_i(\mathbf{w}^\top \mathbf{x}_i + b) \ge 1 

4️⃣ 软间隔与松弛变量

真实数据往往不可完全线性可分,我们引入松弛变量 \xi_i

y_i(\mathbf{w}^\top \mathbf{x}_i + b) \ge 1 - \xi_i, \quad \xi_i \ge 0 

优化目标变为: 

\min_{\mathbf{w}, b, \xi} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^m \xi_i 

其中:

  • C:惩罚参数,平衡间隔大小与误分类点数量

  • C 大:减少误分类,更可能过拟合

  • C 小:允许一定误分类,提升泛化

5️⃣ 对偶问题与拉格朗日乘子法

通过拉格朗日乘子法可将原问题转化为对偶问题:

\max_\alpha \sum_{i=1}^m \alpha_i - \frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j (\mathbf{x}_i^\top \mathbf{x}_j) 

约束条件: 

\sum_{i=1}^m \alpha_i y_i = 0, \quad 0 \le \alpha_i \le C 

支持向量(Support Vectors)
最终只有对应 \alpha_i的样本会成为支持向量参与模型决策。 

6️⃣ 核技巧(Kernel Trick)

SVM可以通过核函数处理非线性可分数据。用核函数代替内积:

K(\mathbf{x}_i, \mathbf{x}_j) = \phi(\mathbf{x}_i)^\top \phi(\mathbf{x}_j) 

常见核函数:

  • 线性核:K(\mathbf{x}, \mathbf{z}) = \mathbf{x}^\top \mathbf{z}

  • 多项式核:K(\mathbf{x}, \mathbf{z}) = (\mathbf{x}^\top \mathbf{z} + c)^d

  • 高斯核(RBF核):

K(\mathbf{x}, \mathbf{z}) = \exp\left( -\frac{\|\mathbf{x} - \mathbf{z}\|^2}{2\sigma^2} \right) 

7️⃣ SVM的损失函数(Hinge Loss)

SVM的损失函数采用铰链损失(Hinge Loss)

\mathcal{L}(y, f(x)) = \max(0, 1 - y f(x)) 

批量形式: 

J(\mathbf{w}, b) = \frac{1}{2}\|\mathbf{w}\|^2 + C \sum_{i=1}^m \max(0, 1 - y_i (\mathbf{w}^\top \mathbf{x}_i + b)) 

8️⃣ Python实现示例 

from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# 构造数据
X, y = make_blobs(n_samples=50, centers=2, random_state=6)
y = np.where(y == 0, -1, 1)

# 训练SVM模型
clf = SVC(kernel='linear', C=1.0)
clf.fit(X, y)

# 绘制决策边界
plt.scatter(X[:,0], X[:,1], c=y, cmap='bwr', s=50)
ax = plt.gca()
xlim = ax.get_xlim()
xx = np.linspace(xlim[0], xlim[1])
yy = -(clf.coef_[0][0] * xx + clf.intercept_[0]) / clf.coef_[0][1]
plt.plot(xx, yy, 'k-')
plt.title('Linear SVM Decision Boundary')
plt.show()

9️⃣ 优缺点总结

✅ 优点

  • 能处理高维特征空间

  • 支持核函数,适用于非线性问题

  • 模型由支持向量决定,鲁棒性强

❌ 缺点

  • 参数选择(C、核参数)较难

  • 对大规模数据集计算量大

  • 对噪声敏感,尤其是C较大时

🔟 应用场景与扩展

  • 文本分类、垃圾邮件过滤

  • 图像分类、人脸识别

  • 手写数字识别(MNIST)

  • 支持向量回归(SVR)

📚 总结

  • SVM通过最大化间隔提升模型泛化能力

  • 软间隔 + 核方法使SVM适应非线性与噪声数据

  • 可根据数据规模与特征选择合适的核函数

 


网站公告

今日签到

点亮在社区的每一天
去签到