共计 1411 个字符,预计需要花费 4 分钟才能阅读完成。
问题描述与 SVM 基础
我们有以下两类训练样本:

- 类别 +1:(1,2), (2,3), (3,3)
- 类别 -1:(2,1)
支持向量机 (SVM) 的核心思想是找到一个最优超平面,使得两类样本间的间隔 (margin) 最大化。这个超平面可以表示为:
$$w^Tx + b = 0$$
其中 $w$ 是法向量,$b$ 是偏置项。对于线性可分的情况,我们使用硬间隔 SVM。
硬间隔 SVM 数学推导
-
间隔定义:样本点到超平面的距离为 $\frac{|w^Tx_i + b|}{|w|}$,我们需要最大化最小距离。
-
优化目标:
$$\min_{w,b} \frac{1}{2}|w|^2$$
约束条件:
$$y_i(w^Tx_i + b) \geq 1, \forall i$$ -
拉格朗日函数:
$$L(w,b,\alpha) = \frac{1}{2}|w|^2 – \sum_{i=1}^n \alpha_i[y_i(w^Tx_i + b) – 1]$$ -
对偶问题:通过对 $w$ 和 $b$ 求偏导并代入,得到对偶形式:
$$\max_{\alpha} \sum_{i=1}^n \alpha_i – \frac{1}{2}\sum_{i,j} \alpha_i \alpha_j y_i y_j x_i^T x_j$$
约束:
$$\alpha_i \geq 0, \sum_{i=1}^n \alpha_i y_i = 0$$
Python 实现
from sklearn import svm
import numpy as np
# 训练数据
X = np.array([[1,2], [2,3], [3,3], [2,1]])
y = np.array([1, 1, 1, -1])
# 创建 SVM 模型(线性核)
clf = svm.SVC(kernel='linear', C=1000) # 大 C 值近似硬间隔
clf.fit(X, y)
# 获取超平面参数
w = clf.coef_[0]
b = clf.intercept_[0]
print(f"超平面方程: {w[0]:.2f}x1 + {w[1]:.2f}x2 + {b:.2f} = 0")
核函数比较
SVM 的强大之处在于可以通过核函数处理非线性问题:
-
线性核:适用于线性可分情况
svm.SVC(kernel='linear') -
多项式核:
svm.SVC(kernel='poly', degree=3) -
RBF 核(默认):
svm.SVC(kernel='rbf', gamma='scale')
实战经验
- 样本不平衡处理:
- 使用 class_weight 参数
-
上采样 / 下采样
-
参数 C 的选择:
- 小 C:允许更多误分类,模型更简单
-
大 C:严格分类,可能过拟合
-
特征缩放:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
生产环境最佳实践
-
模型压缩 :对于线性 SVM,使用
LinearSVC替代SVC提高速度 -
增量学习:大数据集使用
partial_fit -
模型持久化:
from joblib import dump dump(clf, 'svm_model.joblib')
思考题
- 当训练数据中存在噪声点时,硬间隔 SVM 会遇到什么问题?如何解决?
- 为什么 RBF 核函数在实际应用中表现往往优于多项式核?
- 在大规模数据集上应用 SVM 时,有哪些计算效率优化策略?
通过这个小例子,我们完整走过了从理论推导到实践应用的 SVM 学习路径。建议读者尝试修改样本数据,观察决策边界的变化,这是理解 SVM 工作机制的最佳方式。
