首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libsvm svm_node和svm_predict

libsvm svm_node和svm_predict
EN

Stack Overflow用户
提问于 2016-05-12 13:03:38
回答 2查看 871关注 0票数 1

对于如何正确使用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数组时,我所做的是

代码语言:javascript
复制
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);

分类器只会产生相同的结果。我不确定我是否要转义零值,如果我没有,结果是一样的。有人知道我是不是做错了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-13 06:35:53

我设法解决了这个问题,代码中的错误是第一个特性的开始索引。因此,与我在另一篇文章中看到的相反,libsvm索引从零开始。使用以下代码,分类器正确工作:

代码语言:javascript
复制
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代码来自作者。

票数 0
EN

Stack Overflow用户

发布于 2018-04-24 19:12:01

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37187800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档