遇到错误:“错误的输入格式:sample_serial_number超出范围”当尝试使用带有LibSVM的预先计算的内核时

时间:2013-08-20 22:54:55

标签: java kernel svm libsvm

我试图使用带有LibSVM 3.17(Java版本)的预先计算的内核,但遇到的错误表明:'错误的输入格式:sample_serial_number超出范围'在svm_train类的read_problem()方法中。

我使用线性内核开始,即取两个向量的点积。我使用的数据已使用[-1,1]范围内的svm_scale进行缩放。保存我的预先计算的内核时,我将保存第一列的行ID(实际上是行的唯一标识符)和后续列的矩阵内容。我生成的矩阵是对称的,我已经包含了下面文件内容的前几个条目供您评估:

1   0:10.3098007199 1:9.691388073999995 2:8.269529587900001 3:10.836359234799996
2   0:9.691388073999995 1:10.441238090599997    2:7.5937360488  3:9.193978496500002
3   0:8.269529587900001 1:7.5937360488  2:8.1263441462  3:9.8885507424
4   0:10.836359234799996    1:9.193978496500002 2:9.8885507424  3:13.705259598099996    

当值为

时发生错误
    48:0.015231278900000159 
在我的预先计算的内核文件中遇到

(恰好在第一行)。出现错误是因为上述值未通过以下测试:

if ((int)prob.x[i][0].value <= 0 || (int)prob.x[i][0].value > max_index)

其中prob.x [i] [0] .value = 0.015231278900000159在svm_train中的read_problem()中。

我对如何继续这一点感到有些困惑。我想知道我是否以正确的文件格式保存了数据?我已经阅读了LibSVM中的README,我认为我正在做所有事情(但显然不是)!!我也看过已经给出的其他答案,例如:

Libsvm precomputed kernelsPrecomputed Kernels with LibSVM in Python

但不幸的是我无法在其中找到答案。

最后一点注意:当我在[0,1]范围内缩放数据时,上面的错误没有发生(因为矩阵中的所有值,现在&gt; = 1),但我感到困惑的是为什么矩阵中的负值似乎首先导致问题。

非常感谢所提供的任何帮助/见解。

2 个答案:

答案 0 :(得分:0)

我在下面仔细阅读John Robertson的帖子后解决了这个问题:

Precomputed Kernels with LibSVM in Python

答案 1 :(得分:0)

我收到了相同的消息,解决方案结果是为培训指定的参数范围无效。例如,在我的情况下,我试图输入'-t 4',而t标志选项仅为(0,1,2,3)。