我正在尝试将预计算内核与 LibSVM 3.17(Java 版本)一起使用,但在 svm_train 类的 read_problem() 方法中遇到错误,指出:“输入格式错误:sample_serial_number 超出范围”。
我使用线性内核开始,即取两个向量的点积。我使用的数据已使用 [-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 中的自述文件,我认为我做的一切都是正确的(但显然不是)!!我还查看了已经给出的其他答案,例如:
Libsvm 预计算内核和 Python 中带有 LibSVM 的预计算内核
但不幸的是,我在其中看不到答案。
最后一点:当我在 [0,1] 范围内缩放数据时,并没有发生上述错误(因为矩阵中的所有值现在 >= 1)但我很困惑为什么其中的负值矩阵似乎首先引起了问题。
提供的任何帮助/见解将不胜感激。