Libsvm和Python:预计算内核使用我的点id作为正常特征



我对libsvm和预计算内核的使用有一个奇怪的问题。我已经将我的数据放在一个dictionary表单中,以遵循文档(与点id相关的密钥0):

from svmutil import *
x=[]
for i in range(N):
    x[i] = {0:i, 1:K(i,0), 2:K(i,1), ...}
    y[i] = true_labels(i)

)然后,我正在做以下操作来训练svm并得到我的训练错误:

svm_prob = svm_problem(y,x,isKernel=True)
svm_param = svm_parameter('-t 4')
svm_mod = libsvm.svm_train(svm_prob,svm_param)
svm_pymod = toPyModel(svm_mod)
# Estimating training error
p_labels, p_acc, p_val = svm_predict(y,x,svm_pymod)

但是最终的输出是完全不正确的,因为p_val的值看起来像:

p_val -> [0.xxx, -1.xxx, -2.xxx, -3.xxx, -4.xxx, ...]

(p_labels当然是[-1,-1,-1,...,]

我的分析:我知道我的核K(i,j)的值远低于1,所以我认为伪特征(0:i)在某个点(可能在预测阶段)已经被libsvm用作正常特征(而不是点id)。我尝试了几种变体,但无法解决这个问题。

提前感谢您对我的代码

的任何帮助或评论

实际上错误很明显,但我保留了我的帖子并在这里回答:点id必须从1开始,而不是从0开始。低级功能libsvm.svm_train不检查这一点,并解决了此错误设置的问题。

在这种情况下,应该使用svmutil函数"svm_train"来显示错误。

一旦这个起始索引被更正,分类器似乎可以正常工作。

最新更新