1

我对 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) . 我尝试了几种变体,但我无法解决这个问题。

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

4

1 回答 1

2

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

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

一旦这个起始索引得到纠正,分类器似乎就可以正常工作了。

于 2013-06-27T13:37:50.667 回答