2016-05-12 16 views
1

Ich habe einige Zweifel, wie man den libSVM C++ - Code richtig verwendet. Unter Verwendung meiner eigenen Matrizen von Daten habe ich einen binären SVM-Klassifikator unter Verwendung der vom Autor bereitgestellten SVM-Train-Exe trainiert. Ich habe auch das Modell mit dem Programm svm-predict getestet. Die Bahn und Testmatrices erstellt wurden, wie von den Autoren vorgeschlagen:libsvm svm_node und svm_predict

Label 1: val_1 ..... n: val_n

Label 1: val_1 ..... n: val_n

1 Label: val_1 ..... n: val_n

.....

Label 1: val_1 ..... n: val_n

Das Modell auf diese Weise zu funktionieren scheint .

Im Moment versuche ich, das Modell aus einer C++ - Anwendung zu laden und nach der Klassifizierung zu fragen. Ich denke, das Problem ist, wenn ich die svm_node Array zu erstellen, was ich tue, ist der folgende

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); 

Der Klassifikator nur produziert immer das gleiche Ergebnis. Ich bin mir nicht sicher, ob ich den Nullwerten sowieso entkommen muss, wenn ich nicht das gleiche Ergebnis habe. Weiß jemand, ob ich etwas falsch mache?

Antwort

0

Ich habe es geschafft, das Problem zu lösen, was in meinem Code falsch ist, ist der Startindex des ersten Features. Im Gegensatz zu dem, was ich in einem anderen Post gelesen habe, beginnt der libsvm-Index bei Null. Mit dem folgenden Code funktioniert der Klassifizierer korrekt:

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; 

Ich habe auch die Skip-Zero-Kontrolle entfernt. Hoffe, das könnte jemandem helfen!

Quelle svm-predict.c-Code des Autors.