对OneClassSVM的“ dual_coef_”感到困惑

时间:2019-07-10 08:38:06

标签: python scikit-learn svm libsvm

我已阅读sklearn中有关one-class-svm的论文“估计高维分布的支持”。

我注意到对偶变量的约束是∑_iα_i= 1。

但是当我尝试调用api clf._dual_coef_时,我发现clf._dual_coef_的总和不是1。

我是否错过任何细节?

谢谢

1 个答案:

答案 0 :(得分:0)

结果

对于一类SVM,LIBSVM解决了一个缩放问题,每个α_i都乘以(νℓ),其中ν是超参数,而ℓ是实例数。因此约束变为α_i≤1且∑_iα_i=νℓ。


原因

LIBSVM的2.3节中

类似于ν-SVC的情况,在LIBSVM中,我们求解(7)的缩放版本。

在第2.2节(v-支持向量分类)中引用的地方

在LIBSVM中,我们解决问题(5)的缩放版本,因为由于约束α_i≤1/ℓ,数值α_i可能太小。

因此对于一类SVM,LIBSVM解决了一个定标问题,因为数值α_i由于约束α_i≤1/(ν1/)可能太小。


验证

具体来说,由于问题是关于sklearn的,所以我修改了here中的代码以确认思想,尽管根据我的理解sklearn.svm.OneClassSVM在后端中使用LIBSVM。

from sklearn.svm import OneClassSVM
from sklearn.datasets import load_boston

X = load_boston()['data'][:, [8, 10]]
clf = OneClassSVM(nu=0.261, gamma=0.05)
clf.fit(X)

print(clf.nu*X.shape[0])
print(clf._dual_coef_.sum())

给予

132.066
132.06599999999918