共计 2194 个字符,预计需要花费 6 分钟才能阅读完成。
一、从玩具数据集理解 SVM 核心思想
我们先看这个简单的二维数据集:

- 正类样本(标签 +1):(1,2)、(2,3)、(3,3)
- 负类样本(标签 -1):(2,1)
用 matplotlib 绘制散点图可以看到:
import matplotlib.pyplot as plt
X = [[1,2], [2,3], [3,3], [2,1]]
y = [1, 1, 1, -1]
plt.scatter(*zip(*X[:3]), c='red', label='Positive')
plt.scatter(*zip(*X[3:]), c='blue', label='Negative')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.grid()
通过可视化可以直观发现: 这些样本是线性可分的 。SVM 要做的就是找到那个 ” 最公平 ” 的分界线——让正负类样本到决策边界的距离(间隔)最大化。
二、数学原理与公式推导
1. 决策函数
SVM 的决策函数为:
f(x) = sign(w·x + b)
其中 w 是法向量,b 是偏置项。优化目标是:
min 1/2 ||w||²
s.t. y_i(w·x_i + b) ≥ 1
2. 对偶问题
通过拉格朗日乘子法转化为对偶问题:
max Σα_i - 1/2 ΣΣα_iα_j y_i y_j x_i·x_j
s.t. α_i ≥ 0, Σα_i y_i = 0
三、Python 实战实现
1. 基础建模流程
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
# 数据标准化(重要!)scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 线性核 SVM
model = SVC(kernel='linear', C=1.0)
model.fit(X_scaled, y)
# 绘制决策边界
def plot_decision_boundary(model):
# 获取坐标轴范围
x_min, x_max = X_scaled[:,0].min()-1, X_scaled[:,0].max()+1
y_min, y_max = X_scaled[:,1].min()-1, X_scaled[:,1].max()+1
# 生成网格点
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
# 预测并绘制
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X_scaled[:,0], X_scaled[:,1], c=y)
plot_decision_boundary(model)
2. 不同核函数对比
# 尝试 RBF 核
model_rbf = SVC(kernel='rbf', gamma=0.5)
model_rbf.fit(X_scaled, y)
# 可视化对比
plt.figure(figsize=(12,4))
plt.subplot(121)
plot_decision_boundary(model) # 线性核
plt.title('Linear Kernel')
plt.subplot(122)
plot_decision_boundary(model_rbf) # RBF 核
plt.title('RBF Kernel')
四、关键问题深入分析
1. 正则化参数 C 的影响
- C 值小:容忍更多误分类,间隔更大
- C 值大:严格要求分类正确,可能过拟合
for C in [0.1, 1, 10]:
model = SVC(kernel='linear', C=C).fit(X_scaled, y)
plot_decision_boundary(model)
plt.title(f'C={C}')
plt.show()
2. 支持向量的意义
# 获取支持向量
print(model.support_vectors_) # 标准化后的坐标
print(model.support_) # 支持向量的索引
支持向量是决定决策边界的关键样本,它们位于间隔边界上。
五、生产环境注意事项
- 特征缩放必须做 :SVM 对特征尺度敏感
- 大数据量优化 :
- 使用 LinearSVC 替代 SVC(kernel=’linear’)
- 考虑随机梯度下降的 SGDClassifier
- 类别不平衡 :
- 设置 class_weight 参数
- 采用过采样 / 欠采样
六、思考与扩展
如何将这个方法扩展到高维空间?实际上 sklearn 已经帮我们处理了:
# 处理高维数据(如 100 维)from sklearn.datasets import make_classification
X_high, y_high = make_classification(n_features=100, n_classes=2)
svc = SVC(kernel='rbf').fit(X_high, y_high)
核心区别在于:高维空间中我们无法可视化决策边界,但数学原理完全一致。当特征维度远大于样本量时,建议使用线性核避免维度灾难。
通过这个小案例,我们完整走过了 SVM 从理论推导到工程实现的全部流程。建议读者尝试修改样本数据,观察决策边界的变化,这能帮助你形成更直观的理解。
正文完
