如何在 C++ 中通过 libSVM 使用 auto_train

Posted

技术标签:

【中文标题】如何在 C++ 中通过 libSVM 使用 auto_train【英文标题】:How to use auto_train in C++ with libSVM 【发布时间】:2015-04-04 01:19:37 【问题描述】:

我正在尝试使用 libSVM 的 auto_train 函数自动训练我的数据集。 阅读此页http://docs.opencv.org/modules/ml/doc/support_vector_machines.html 我试过这段代码:

CvSVMParams params;
params.svm_type    = CvSVM::C_SVC;
params.kernel_type = CvSVM::RBF;

因为我想要一个 RBF 内核。 然后:

CvSVM SVM;
SVM.train_auto(trainFINAL, labelsFinal, Mat(), Mat(), params, 10, ...
   CvSVM::get_default_grid(CvSVM::C), CvSVM::get_default_grid(CvSVM::GAMMA), ...
   CvSVM::get_default_grid(CvSVM::P), CvSVM::get_default_grid(CvSVM::NU), ...
   CvSVM::get_default_grid(CvSVM::COEF), CvSVM::get_default_grid(CvSVM::DEGREE), ...
   false);

之后我尝试以这种方式绘制新参数:

CvSVMParams newParams = SVM.get_params();
cout << endl;
cout << "KERNEL   : " << newParams.kernel_type << endl;
cout << "SVM TYPE : " << newParams.svm_type << endl;
cout << "degree   : " << newParams.degree << endl;
cout << "gamma    : " << newParams.gamma << endl;
cout << "coef0    : " << newParams.coef0 << endl;
cout << "Cvalue   : " << newParams.C << endl;
cout << "p        : " << newParams.p << endl;

但我无法理解两件事:

首先,为什么在newParams.svm_type中它返回给我100(我指定了C-SVC,它应该是0)

第二,这样画参数对吗?

【问题讨论】:

【参考方案1】:

“首先,为什么在newParams.svm_type中它返回给我100(我指定了C-SVC,它应该是0)”

OpenCV 枚举与 L​​ibSVM 的略有不同,请参阅http://docs.opencv.org/ref/2.4/dd/d88/classCvSVM.html

C_SVC 是 100,是 OpenCV 中的第一种 SVM(相对于 LibSVM 中的 0)。

“第二,这样画参数对吗?”

我不确定你所说的“绘制”参数是什么意思,但如果你想知道 newParams 是否是优化参数,那么是的。

【讨论】:

以上是关于如何在 C++ 中通过 libSVM 使用 auto_train的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中通过引用返回类对象?

如何在 C++ 程序中通过拓扑考虑在多核 HT 上实现亲和性?

如何在 C++ 中通过指针传递字符串?

如何在 C++ 中通过引用返回向量

如何访问在 C++ 中通过引用传递的列表/向量的元素

在 C++ 中通过指针捕获异常