我们正在使用scikit-learn OneClassSVM
训练1级svm,这是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
大多数训练样本被错误分类。
有人可以解释这是怎么发生的吗?