对 OneClassSVM 的 "dual_coef_" 感到困惑

Confuse about "dual_coef_" of OneClassSVM

我已经阅读了sklearn中提供的关于one-class-svm的论文"Estimating the Support of a High-Dimensional Distribution"。

我注意到对偶变量有一个约束 ∑_i α_i =1。

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

我是不是漏掉了任何细节?

谢谢

结果

对于一个-class SVM,LIBSVM解决了一个缩放问题,即每个α_i乘以(νℓ),其中ν是超参数,ℓ是实例数。所以约束变为α_i≤1和∑_i α_i = νℓ.


原因

LIBSVM

的第 2.3 节中

Similar to the case of ν-SVC, in LIBSVM, we solve a scaled version of (7).

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

In LIBSVM, we solve a scaled version of problem (5) because numerically α_i may be too small due to the constraint α_i≤1/ℓ.

所以对于one-class SVM,LIBSVM解决了一个缩放问题,因为由于约束α_i≤1/(νℓ),在数值上α_i可能太小了。


验证

具体来说,因为问题是关于sklearn的,所以我修改了代码here to confirm thought, though from my understanding sklearn.svm.OneClassSVM use LIBSVM in the backend.

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