在支持向量机(SVM)中,松弛变量(Slack Variables) 和 惩罚参数(C) 是处理 线性不可分数据 和 噪声数据 的关键机制。它们共同作用,使模型在保持最大间隔分类的同时,允许一定程度的分类错误,从而提高泛化能力。
以下是详细解释:
一、松弛变量(Slack Variables)的作用
二、惩罚参数(C)的作用
三、松弛变量与惩罚参数的协同作用
1. 解决线性不可分问题
通过调整 CC,可以灵活处理以下情况:
- 少量噪声:通过较大的 CC 限制松弛变量,避免模型被噪声主导。
- 复杂分布:通过较小的 CC 增大间隔,防止过拟合。
2. 几何解释
-
硬间隔 vs 软间隔:
- 硬间隔的决策边界是“刚性”的,无法处理重叠数据。
- 软间隔的决策边界是“柔性”的,通过松弛变量允许边界附近的样本存在一定错误。
四、代码示例:不同 CC 值的效果对比
以下代码展示不同 C 值对分类边界的影响(使用线性核):
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
# 生成带有轻微重叠的数据
X, y = make_blobs(n_samples=100, centers=2, cluster_std=1.2, random_state=42)
# 训练不同 C 值的 SVM
C_values = [0.1, 1, 100]
models = [svm.SVC(kernel='linear', C=C).fit(X, y) for C in C_values]
# 绘制决策边界
def plot_decision_boundary(model, C):
w = model.coef_[0]
b = model.intercept_[0]
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx = np.linspace(x_min, x_max, 100)
yy = (-w[0]/w[1]) * xx - b/w[1]
margin = 1 / np.sqrt(w[0]**2 + w[1]**2)
yy_up = yy + np.sqrt(1 + (w[0]/w[1])**2) * margin
yy_down = yy - np.sqrt(1 + (w[0]/w[1])**2) * margin
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
plt.plot(xx, yy, 'k-', label=f'C={C}')
plt.plot(xx, yy_up, 'k--')
plt.plot(xx, yy_down, 'k--')
plt.title(f"SVM Decision Boundary (C={C})")
plt.show()
for model, C in zip(models, C_values):
plot_decision_boundary(model, C)
输出结果:
- C=0.1:间隔较宽,允许部分样本进入间隔或误分类。
- C=1:平衡间隔宽度和分类错误。
- C=100:间隔变窄,严格限制违反。
五、总结
| 概念 | 作用 |
|---|---|
| 松弛变量 ξiξi | 量化样本对间隔的违反程度,允许部分样本不满足硬约束。 |
| 惩罚参数 CC | 控制模型对违反行为的惩罚力度,平衡间隔最大化和分类错误的容忍度。 |
| 实际意义 | 通过调整 CC,SVM 可以在过拟合和欠拟合之间找到平衡,适应复杂数据分布。 |