猿问

Libsvm和Python:预先计算的内核是否将我的点ID用作常规功能?

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


holdtom
浏览 189回答 1
1回答

慕森王

实际上,该错误非常明显,但我保留了我的文章并在此处回答:点ID必须在1而不是处开始0。低级功能libsvm.svm_train不会对此进行检查,并且会解决此不正确设置的问题。在这种情况下,应该改用显示错误的svmutil功能“ svm_train”。纠正此起始索引后,分类器似乎可以正常工作。
随时随地看视频慕课网APP

相关分类

Python
我要回答