[机器学习]svm支持向量机(松弛变量和惩罚参数)

518 阅读2分钟

在支持向量机(SVM)中,松弛变量(Slack Variables)惩罚参数(C) 是处理 线性不可分数据噪声数据 的关键机制。它们共同作用,使模型在保持最大间隔分类的同时,允许一定程度的分类错误,从而提高泛化能力。

以下是详细解释:


一、松弛变量(Slack Variables)的作用

图片.png


二、惩罚参数(C)的作用

图片.png


三、松弛变量与惩罚参数的协同作用

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:间隔变窄,严格限制违反。

不同 C 值的影响


五、总结

概念作用
松弛变量 ξiξi​量化样本对间隔的违反程度,允许部分样本不满足硬约束。
惩罚参数 CC控制模型对违反行为的惩罚力度,平衡间隔最大化和分类错误的容忍度。
实际意义通过调整 CC,SVM 可以在过拟合和欠拟合之间找到平衡,适应复杂数据分布。