事前に計算されたカーネルを LibSVM 3.17 (Java バージョン) で使用しようとしていますが、svm_train クラスの read_problem() メソッド内で「入力形式が正しくありません: sample_serial_number が範囲外です」というエラーが発生します。
まず線形カーネルを使用しています。つまり、2 つのベクトルのドット積をとっています。私が使用しているデータは、[-1,1] の範囲で svm_scale を使用してスケーリングされています。事前に計算されたカーネルを保存するとき、最初の列には行の ID (実質的に行の一意の識別子) を保存し、後続の列には行列の内容を保存します。生成されたマトリックスは対称であり、評価のために以下のファイル コンテンツの最初の 2 つのエントリを含めました。
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)
ここで、svm_train の read_problem() 内の prob.x[i][0].value = 0.015231278900000159 です。
これをどのように進めるかについて、私は少し立ち往生しています。データを正しいファイル形式で保存したかどうか疑問に思っていますか? 私は LibSVM 内の README を読みましたが、すべてを正しく行っていると思います(しかし、明らかにそうではありません)!! 次のような、すでに与えられた他の回答も見ました。
Libsvm 事前計算済みカーネルと Python の LibSVM を使用した事前計算済みカーネル
残念ながら、それらの中に答えは見えません。
最後の注意: [0,1] の範囲でデータをスケーリングした場合、上記のエラーは発生しませんでした (マトリックス内のすべての値が現在 >= 1 になっているため)。そもそもマトリックスが問題を引き起こしているようです。
提供されるヘルプ/洞察は大歓迎です。