SVM:为什么当 C 增加时支持向量的数量会减少?

机器算法验证 支持向量机 Python libsvm
2022-03-22 02:14:24

我正在学习如何在 python 中通过 sklearn.svm 使用 libsvm。我在这里读到了当您将 C 值更改为模型的一部分时会发生什么以及为什么。我的直觉是,较低的 C 值将使用较少的支持向量来进行更一般的分类,而较高的 C 值将使用更多的支持向量来尝试“过度拟合”并解释所有异常值。

事实并非如此。例如,我循环了一组 C 值,如下所示:

print(c)
model = svm.SVC(kernel='linear', C=c)
model.fit(Xtrain, ytrain)
print("support vectors:", len(model.support_))

我得到了结果:

1.0
support vectors: 1810
10.0
support vectors: 1750
100.0
support vectors: 1626
1000.0
support vectors: 1558

如您所见,随着 C 的增加,模型中使用的支持向量的数量会减少。为什么会这样?

1个回答

简而言之,C 是对松弛变量的惩罚,它衡量违反边际约束的程度。如果核扩展(即 SVM 的输出)具有介于 -1 和 +1 之间的值,则训练模式违反了边际约束,并且所有违反此约束的模式都将是支持向量。如果增加 C,则会对违反约束施加更大的惩罚,解决方案将改变以减少违规的大小(以及因此违规的数量),因此边距变窄,其中的模式将减少,所以支持向量更少。

预期的错误率取决于边际和松弛变量的总和,因此在实践中,泛化通过两种质量之间的折衷来最大化,给出中间值 C。