我使用的是libsvm 3.16版本。我已经在Matlab中进行了一些训练,并创建了一个模型。现在我想将这个模型保存到磁盘,并在我的C++程序中加载这个模型。到目前为止,我找到了以下几种替代方案:
- 这个回答解释了如何从C++保存模型,这是基于这个网站的。并不是我所需要的,但可以进行调整。(这需要开发时间)。
- 我可以在Matlab中找到最佳的训练参数(核函数,C),然后在C++中重新训练所有内容。(每次更改参数时都需要在C++中进行训练。这不具备可扩展性)。
因此,这两种选择都不令人满意,
有谁有好的建议吗?
回答:
实际上,第一个选项相当合理。如果你通过Matlab将模型保存为libsvm的C格式,那么使用libsvm提供的函数在C/C++中处理模型就非常简单了。尝试在C++中处理Matlab格式的数据可能会困难得多。
“svm-predict.c”文件中的main
函数(位于libsvm包的根目录)可能包含你需要的大部分内容:
if((model=svm_load_model(argv[i+1]))==0){ fprintf(stderr,"can't open model file %s\n",argv[i+1]); exit(1);}
例如,要使用模型预测标签x
,你可以运行
int predict_label = svm_predict(model,x);
这其中最棘手的部分是将你的数据转换为libsvm格式(除非你的数据已经是libsvm文本文件格式,在这种情况下,你可以直接使用”svm-predict.c”中的predict
函数)。
libsvm向量x
是一个struct svm_node
数组,表示一个稀疏数据数组。每个svm_node都有一个索引和一个值,并且向量必须以索引设置为-1结束。例如,要编码向量[0,1,0,5]
,你可以这样做:
struct svm_node *x = (struct svm_node *) malloc(3*sizeof(struct svm_node));x[0].index=2; //注意:libsvm索引从1开始x[0].value=1.0;x[1].index=4;x[1].value=5.0;x[2].index=-1;
对于分类器(C_SVC)以外的SVM类型,请查看”svm-predict.c”中的predict
函数。