Libsvm 和 Python:预计算内核使用我的点 id 作为正常功能?
Posted
技术标签:
【中文标题】Libsvm 和 Python:预计算内核使用我的点 id 作为正常功能?【英文标题】:Libsvm and Python : Precomputed Kernels are using my point id as a normal feature? 【发布时间】:2013-06-24 02:18:24 【问题描述】:我对 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 在某个时候(可能在预测阶段)用作正常特征(而不是作为点编号)。
我尝试了几种变体,但无法解决此问题。
提前感谢您对我的代码的任何帮助或 cmets,
【问题讨论】:
【参考方案1】:这个错误实际上很明显,但我保留我的帖子并在这里回答:
点 id 必须从 1
而不是 0
开始。低级函数libsvm.svm_train
不检查这个,解决了这个错误设置的问题。
在这种情况下应该使用svmutil
函数“svm_train
”来显示错误。
一旦这个起始索引得到纠正,分类器似乎就可以正常工作了。
【讨论】:
以上是关于Libsvm 和 Python:预计算内核使用我的点 id 作为正常功能?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 matlab 中使用带有 libsvm 的预计算内核
遇到和错误:尝试使用带有 LibSVM 的预计算内核时出现“错误的输入格式:sample_serial_number 超出范围”