0

事前に計算されたカーネルを 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 になっているため)。そもそもマトリックスが問題を引き起こしているようです。

提供されるヘルプ/洞察は大歓迎です。

4

2 に答える 2

0

同じメッセージを受け取りましたが、トレーニングに指定されたパラメーターの範囲が無効であることがわかりました。たとえば、私の場合、t フラグ オプションが (0,1,2,3) のみのときに「-t 4」と入力しようとしました。

于 2017-08-01T16:18:02.933 に答える