libsvm svm_node和svm_predict

时间:2016-05-12 13:03:38

标签: c++ libsvm

我对如何正确使用libSVM C ++代码有些怀疑。 使用我自己的数据基础,我使用作者提供的svm-train exe训练了一个二进制SVM分类器。我还使用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);

分类器只会产生相同的结果。如果我不这样做,我不确定是否必须逃避零值。有谁知道我做错了什么?

2 个答案:

答案 0 :(得分: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代码。

答案 1 :(得分:0)

您需要在训练集中拥有相同数量的样本。举个例子; classA有500个实例。 classB有500个实例。否则,您将获得与训练集中使用的较大类相同的所有结果。