我对如何正确使用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);
分类器只会产生相同的结果。如果我不这样做,我不确定是否必须逃避零值。有谁知道我做错了什么?
答案 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个实例。否则,您将获得与训练集中使用的较大类相同的所有结果。