2016-05-12 34 views
1

我對如何正確使用libSVM C++代碼有些疑惑。 使用我自己的數據矩陣我已經使用作者提供的svm-train exe訓練了一個二進制SVM分類器。我還使用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++應用程序加載模型並要求進行分類。我認爲這個問題是,當我創建了svm_node陣列,我做的是以下

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

的分類只是生產總是相同的結果。我不確定是否必須逃避零值,否則結果不一樣。有誰知道我是否做錯了什麼?

回答

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; 

我也刪除了skip-zero控件。 希望這可以幫助別人!

來自作者的源svm-predict.c代碼。