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?