一、SVM 简介与应用场景
支持向量机(SVM)是一种基于统计学习理论的监督学习模型,最初用于二分类问题,但已广泛应用于多分类、回归、异常检测等场景。其核心思想是:在特征空间中寻找一个最优超平面,将不同类别的样本分开,并最大化类别间的间隔(margin)。
典型应用
- 文本/垃圾邮件分类
- 图像识别与人脸检测
- 基因/蛋白质分类、生物信息学
- 手写数字识别
- 金融风控、异常检测
- 回归预测(SVR)
二、SVM 分类的数学原理
1. 线性可分 SVM
对于线性可分数据,SVM 目标是在特征空间中找到一个最优超平面(optimal separating hyperplane),使得两类样本间隔最大。
决策函数:$f(x) = \mathrm{sign}(w^T x + b)$
最优间隔的数学表达:$\min_{w, b} \frac{1}{2} |w|^2$
约束条件:$y_i (w^T x_i + b) \geq 1, \quad \forall i$
支持向量:距离超平面最近的样本点,决定了分类边界的位置。
2. 软间隔与正则化
实际数据往往不可完全线性分割,引入松弛变量 $\xi_i$ 和正则化参数 $C$,允许部分样本被误分:
$\min_{w, b, \xi} \frac{1}{2} |w|^2 + C \sum_{i=1}^n \xi_i$
约束:$y_i (w^T x_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0$
$C$ 控制间隔最大化与误分类惩罚的权衡。
3. 非线性 SVM 与核方法
当数据线性不可分时,SVM 通过核函数(Kernel Trick)将数据映射到高维空间,使其线性可分。
常见核函数:
高斯径向基核(RBF):$K(x, x') = \exp\left(-\gamma |x - x'|^2\right)$
多项式核:$K(x, x') = (x^T x' + c)^d$
线性核:$K(x, x') = x^T x'$
核方法让 SVM 能处理复杂的非线性分类问题。
4. SVM 分类的对偶问题与支持向量
SVM 最终可转化为对偶问题,只有支持向量(即 $\alpha_i > 0$ 的样本)参与决策:
$\max_{\alpha} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j=1}^n \alpha_i \alpha_j y_i y_j K(x_i, x_j)$
约束:$0 \leq \alpha_i \leq C, \quad \sum_{i=1}^n \alpha_i y_i = 0$
最终分类函数:$f(x) = \mathrm{sign}\left(\sum_{i=1}^n \alpha_i y_i K(x_i, x) + b\right)$
三、SVM 回归(SVR, Support Vector Regression)原理
SVM 不仅能做分类,还能做回归(SVR)。其目标是找到一个对大多数样本误差在 $\epsilon$ 范围内的回归函数。
SVR 优化目标:
$\min_{w, b, \xi, \xi^} \frac{1}{2} |w|^2 + C \sum_{i=1}^n (\xi_i + \xi_i^)$
约束:
$\begin{cases} y_i - (w^T x_i + b) \leq \epsilon + \xi_i \ (w^T x_i + b) - y_i \leq \epsilon + \xi_i^* \ \xi_i, \xi_i^* \geq 0 \end{cases}$
SVR 同样可结合核函数实现非线性回归。
四、SVM 分类案例流程(手动二维数据)
1. 构造数据
假设我们有如下二维点:
| 点 | $x_1$ | $x_2$ | 类别 |
|---|---|---|---|
| A | 2 | 3 | 1 |
| B | 3 | 3 | 1 |
| C | 2 | 2 | 1 |
| D | 7 | 8 | -1 |
| E | 8 | 8 | -1 |
| F | 7 | 7 | -1 |
类别 1 用红色,类别 -1 用蓝色。
2. 可视化原始数据
- 用散点图画出这 6 个点,不同类别不同颜色。
- 你会看到两组点在二维空间中分布明显。
3. SVM 训练流程
- 目标:找到一条直线(超平面)将两类点分开,并让两类点距离这条线的'间隔'最大。
- SVM 自动确定这条线的位置和方向。
- 训练后,距离分界线最近的点就是'支持向量(Support Vector)',它们决定了分类边界。
4. 结果与决策边界
- SVM 会输出决策边界(分界线),并标出支持向量。
- 你可以用网格点可视化 SVM 的分界线和每个点的分类区域。
五、SVR 回归案例流程(手动一维数据)
1. 构造数据
假设我们有如下回归样本:
| $x$ | $y$ |
|---|---|
| -2 | -1.1 |
| -1 | -0.8 |
| 0 | 0.1 |
| 1 | 0.9 |
| 2 | 1.2 |
2. 可视化原始数据
- 用散点图画出 $x$ 与 $y$ 的关系。
3. SVR 训练流程
- 目标:找到一条曲线或直线,使得大部分点落在'$\epsilon$ 带宽'内(即误差在 $\epsilon$ 以内)。
- 带宽外的点会产生惩罚,模型会平衡拟合度和间隔宽度。
- 支持向量是那些正好落在 $\epsilon$ 带宽边界上的点。
4. 结果与回归曲线
- SVR 会输出拟合曲线和 $\epsilon$ 带宽(上下两条虚线)。
- 可视化时,回归曲线穿过数据点,大部分点在带宽内,极少数点在带宽外。
六、完整 Python 代码实现(含数据、SVM 及 SVR 示例)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC, SVR
# SVM 分类案例
X_cls = np.array([[2,3],[3,3],[2,2],[7,8],[8,8],[7,7]])
y_cls = np.array([1,1,1,-1,-1,-1])
plt.figure(figsize=(6,5))
plt.scatter(X_cls[y_cls==1,0], X_cls[y_cls==1,1], color='red', label='Class 1')
plt.scatter(X_cls[y_cls==-1,0], X_cls[y_cls==-1,1], color='blue', label='Class -1')
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('Raw Data (SVM Classification)')
plt.legend()
plt.show()
# 训练 SVM
clf = SVC(kernel='linear', C=100)
clf.fit(X_cls, y_cls)
# 可视化决策边界
w = clf.coef_[0]
b = clf.intercept_[0]
xx = np.linspace(1, 9, 100)
yy = -(w[0]*xx + b)/w[1]
plt.figure(figsize=(,))
plt.scatter(X_cls[y_cls==,], X_cls[y_cls==,], color=, label=)
plt.scatter(X_cls[y_cls==-,], X_cls[y_cls==-,], color=, label=)
plt.plot(xx, yy, , label=)
plt.scatter(clf.support_vectors_[:,], clf.support_vectors_[:,], s=, facecolors=, edgecolors=, linewidths=, label=)
plt.xlabel()
plt.ylabel()
plt.title()
plt.legend()
plt.show()
X_reg = np.array([[-],[-],[],[],[]])
y_reg = np.array([-, -, , , ])
plt.scatter(X_reg, y_reg, color=, label=)
plt.xlabel()
plt.ylabel()
plt.title()
plt.legend()
plt.show()
svr = SVR(kernel=, C=, epsilon=)
svr.fit(X_reg, y_reg)
X_plot = np.linspace(-, , ).reshape(-,)
y_pred = svr.predict(X_plot)
plt.scatter(X_reg, y_reg, color=, label=)
plt.plot(X_plot, y_pred, color=, label=)
plt.xlabel()
plt.ylabel()
plt.title()
plt.plot(X_plot, y_pred + svr.epsilon, , lw=)
plt.plot(X_plot, y_pred - svr.epsilon, , lw=)
plt.legend()
plt.show()
七、流程小结
- SVM 分类:先画点→找分界线→支持向量→可视化决策边界
- SVR 回归:先画点→拟合回归线→画出 $\epsilon$ 带宽→可视化结果
八、SVM 的优缺点与工程建议
优点:
- 理论基础扎实,泛化能力强
- 能处理高维、非线性、复杂边界数据
- 支持多种核函数,灵活性高
- 仅依赖支持向量,模型稀疏
缺点:
- 对参数(C、gamma)和特征缩放敏感
- 训练时间长,难以扩展到超大数据集
- 对多分类支持有限(需用一对多/一对一策略)
工程建议:
- 特征需标准化或归一化
- 小中型数据、特征维度高时优先尝试 SVM
- 通过网格搜索等方法调优 C 和 gamma
- 分类、回归、异常检测等任务均可尝试 SVM
九、总结
支持向量机(SVM)是机器学习中极具代表性的基础模型之一,广泛应用于分类、回归、异常检测等任务。其最大间隔、核方法、支持向量等思想为后续众多算法奠定了理论基础。实际工程中,建议结合特征工程、参数调优和业务需求,灵活选择 SVM 的不同用途和核函数,发挥其最大价值。


