Libsvm和Python:预先计算的内核使用我的点id作为常规功能?

时间:2013-06-26 19:15:46

标签: python libsvm

我对libsvm和预先计算的内核的使用有一个奇怪的问题。 我把我的数据放在一个字典表格中,以遵循文档(与点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)。 我尝试了几种变体,但我无法解决这个问题。

提前感谢您对我的代码提供任何帮助或评论,

1 个答案:

答案 0 :(得分:2)

错误实际上非常明显,但我保留了帖子并在此处回答: 点ID必须从1开始,而不是0。低级别函数libsvm.svm_train不会检查此问题并使用此错误设置解决问题。

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

一旦纠正了此起始索引,分类器似乎正常工作。