我试图使用带有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 kernels和 Precomputed Kernels with LibSVM in Python
但不幸的是我无法在其中找到答案。
最后一点注意:当我在[0,1]范围内缩放数据时,上面的错误没有发生(因为矩阵中的所有值,现在&gt; = 1),但我感到困惑的是为什么矩阵中的负值似乎首先导致问题。
非常感谢所提供的任何帮助/见解。
答案 0 :(得分:0)
我在下面仔细阅读John Robertson的帖子后解决了这个问题:
答案 1 :(得分:0)
我收到了相同的消息,解决方案结果是为培训指定的参数范围无效。例如,在我的情况下,我试图输入'-t 4',而t标志选项仅为(0,1,2,3)。