如何在 C++ 中移植 MATLAB libSVM 参数

Posted

技术标签:

【中文标题】如何在 C++ 中移植 MATLAB libSVM 参数【英文标题】:How to port the MATLAB libSVM parameters in C++ 【发布时间】:2015-04-02 23:35:10 【问题描述】:

在 MATLAB 与 libSVM 的交叉验证中,我发现这些是最好的参数:

model = svmtrain( labels, training, '-s 0 -t 2 -c 10000 -g 100');

现在我想用 OpenCV 复制 C++ 中的分类。

但我不明白如何将C++参数设置为与MATLAB相同:

基于this documentation 我尝试了以下方法:

CvSVMParams params;
params.svm_type    = CvSVM::C_SVC;
params.kernel_type = CvSVM::RBF;
//params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 10000, 1e-6);
params.Cvalue = 10000;
params.gamma = 100;
CvSVM SVM;
SVM.train(train, labels, Mat(), Mat(), params);

但我收到此错误:

error: no member named 'Cvalue' in 'CvSVMParams' params.Cvalue = 10000;

最后一件事,我应该取消注释

 //params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 10000, 1e-6); 

并尝试其他值还是不重要? 因为我什至无法理解在 MATLAB 中如何设置相同的参数。

【问题讨论】:

只是params.C 而不是CValue @berak 谢谢...关于我的第二个问题? C中的这一行:params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 10000, 1e-6) 在matlab中有对应的吗? 不知道 matlab,抱歉。并且您只需要显式设置 TermCriteria,如果您想要的不是标准值 (1000 iter, eps=FLT_MIN) 【参考方案1】:

从 matlab 中的 LibSVM 移植到 OpenCV SVM 时,并非每个参数都具有完全等效的参数。术语标准就是其中之一。请记住,根据您使用的版本,opencv 的 SVM 可能存在一些错误(最新版本不是问题)。

您应该取消注释该行,以便更好地控制您的终止标准。这一行表示算法应该在执行 10000 次迭代时结束。如果您使用 CV_TERMCRIT_EPS,它将在每个向量达到小于指定的精度(对您来说,它的 1e-6)时停止。使用两个停止条件,当它们中的任何一个完成时它都会停止。

或者,也可以尝试将 LibSVM 用于 C++,通过将其链接为库。这将为您提供您在 matlab 中使用的完全相同算法和函数。

【讨论】:

以上是关于如何在 C++ 中移植 MATLAB libSVM 参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB 中运行 libsvm?

如何在 Matlab 中使用 libsvm?

关于libsvm工具箱在64位matlab下的安装说明

记录在学习ML过程中,在MATLAB中集成LibSVM时遇到的问题

如何设置 LIBSVM Matlab 接口?

如何在 Matlab 中训练模型,将其保存到磁盘并加载到 C++ 程序中?