2

我们正在使用 scikit-learn 训练一个 1-class svm OneClassSVM,它是 libsvm 的一个包装器。当我们运行时,它会在下面的输出中verbose=True报告有界支持向量的数量。nBSV = 106

>>> clf = svm.OneClassSVM(nu=0.75, kernel="linear", verbose=True, shrinking=True, tol=0.00001)
>>> clf.fit(x)
[LibSVM].*
optimization finished, #iter = 392
obj = 182.273953, rho = 1.831054
nSV = 260, nBSV = 106

现在,如果我们对训练集进行评估,我们会得到 186 个负数,这比上面的 106 个有界支持向量要多。

>>> y=clf.predict(x)
>>> np.bincount(y.astype(np.int64)+1)
array([186,   0,  98])

根据我对 SVM 的理解,这应该是不可能的。只要有一个非零边距,训练误差就应该是有界支持向量的子集,因为有界支持向量是在边距错误一侧的训练实例,而训练集错误是在边缘错误一侧的实例学习分隔符,位于边距内。

虽然实际数字有所不同,但这一观察结果似乎对该数据集的设置很可靠。我什至看到nBSV=0大多数训练样本都被错误分类。

有人可以解释这是怎么发生的吗?

4

0 回答 0