2016-05-12 5 views
1

libSVM C++コードを正しく使用する方法に疑問があります。 私の独自のデータを使用して、バイナリSVM分類子を訓練しました。作成者が提供するsvm-train exeを使用しています。私はsvm-predict実行ファイルを使ってモデルをテストしました。libsvm svm_nodeとsvm_predict

ラベル1:val_1 ..... N:val_n

ラベル1:val_1 ..... N:著者によって示唆されているように、電車やテストマトリックスが作成されているval_n

ラベル1:val_1 ..... N:val_n

.....

ラベル1:val_1 ..... N:val_nモデルは、このように正常に動作するようです

私がしようとしているのは、C++アプリケーションからモデルをロードし、分類を求めることです。私は、次の

Mat featureVector = ....; //opencv matrix 1 rows x n cols 
int n = featureVector.cols; 
struct svm_node *x = (struct svm_node *) malloc((n+1)*sizeof(struct svm_node)); 

int nonZero = 0; 
for(int i = 0; i < n; i++){ 
    //Escape zero values 
    if(featureVector.at<float>(0,i) != 0){ 
     x[nonZero].index = i+1; //libsvm index start from 1 
     x[nonZero].value = featureVector.at<float>(0,i); 
     nonZero++; 
    } 
} 
x[nonZero].index = -1;//requested by libSVM 

x = (struct svm_node *) realloc(x, (nonZero+1) * sizeof(struct svm_node)); 

//finally ask for prediction 
int prediction = svm_predict(model, x); 

分類器はちょうど常に同じ結果を生成している何をすべきか、私はsvm_node配列を作成するときに問題があると思います。私は結果が同じでなければ、ゼロ値をエスケープする必要があるかどうかはわかりません。誰かが私が何か間違っているかどうか知っていますか?

答えて

0

私は問題を解決することができましたが、私のコードで間違っているのは、最初の機能の開始インデックスです。逆に、私が他の記事で読んだものとは異なり、libsvmインデックスはゼロから始まります。次のコードを使用すると、分類器は正常に動作します。

int n = featureVector.cols; 
struct svm_node *x = (struct svm_node *) malloc((n+1)*sizeof(struct svm_node)); 

for(int i = 0; i < n; i++){ 

     x[i].index = i; 
     x[i].value = featureVector.at<float>(0,i); 

} 

x[n].index = -1; 

また、スキップゼロコントロールも削除しました。 これは誰かを助けることができますように!

ソースからのsvm-predict.cコード。

関連する問題