对于如何正确使用libSVM C++代码,我有一些疑问。使用我自己的数据矩阵,我使用作者提供的svm-train exe训练了一个二进制支持向量机分类器。我还使用svm预测可执行文件测试了模型。按照作者的建议,建立了培训和测试矩阵:
标签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);分类器只会产生相同的结果。我不确定我是否要转义零值,如果我没有,结果是一样的。有人知道我是不是做错了什么吗?
发布于 2016-05-13 06:35:53
我设法解决了这个问题,代码中的错误是第一个特性的开始索引。因此,与我在另一篇文章中看到的相反,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代码来自作者。
发布于 2018-04-24 19:12:01
您需要在培训集中有相同数量的样本。例如,classA有500个实例。classB有500个实例。否则,您将获得与您在培训集中使用的更大类相同的所有结果。
https://stackoverflow.com/questions/37187800
复制相似问题