c++ - 如何使用多个 SVM 分类器 - 每个分类器都有一个特定的内核 - 作为 "one vs rest classification"方案?

标签 c++ opencv machine-learning svm

假设我们有 5 个不同类别的样本,如 A、B、C、D 和 E。在我的例子中,要使用“一对一分类”方法,必须有 5 个一对一的 SVM 分类器,一些如下所示:

SVM1:A 与休息

SVM2:B 与休息

SVM3:C 与休息

SVM4:D 与休息

SVM5:E 与休息

这 5 个分类器使用训练样本进行训练,每个分类器使用不同的内核。新输入的样本被传递给 5 个分类器中的每一个进行分类。然后考虑这样一种情况:实际上属于“A”类的新样本被 SVM1 分类为“A”的成员(这是正确的),同时它被分类为“D”的成员SVM4(不正确),问题是如何找出这两个 SVM 中哪个预测正确。我知道必须有某种标准来比较这两者的预测置信度。 我正在使用 opencv 2.4.8,通过下面的语法它可以预测新样本所属类的标签:

float Response = SVM.predict(new_test_sample,false);

我也知道有一个选项可以通过以下语法找出新样本与 SVM 决策边界的距离:

float Distanc = SVM.predict(test, true);

由于我为每个 SVM 分类器使用不同的内核和不同的参数(所以我知道我不能通过简单地比较距离与决策边际来比较预测置信度...),我的问题是我如何才能比较分类器的预测置信度,让我最终知道新样本属于哪一类? 谢谢大家

最佳答案

在这种情况下,您通常会使用 Platt 缩放比例。有效地,它只是将逻辑回归拟合到您的决策函数之上,以“校准”您的估计,因此它们具有可比性。结果,您获得了每个分类器的概率估计 P(y|x),现在可以在多个模型之间进行比较。

一般来说,OpenCV 是相当糟糕的分类器来源,我会考虑使用实际的 ML 包,它可以让您访问此类标准工具。特别是 libsvm,OpenCV 环绕 - 具有此功能。

关于c++ - 如何使用多个 SVM 分类器 - 每个分类器都有一个特定的内核 - 作为 "one vs rest classification"方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36987065/

相关文章:

c++ - 在 mingw-w64/msys2 中编​​译的应用程序, "the application was unable to start correctly (0xc00007b"

python - 如何在OpenCV Python中设置框架的高度和宽度

c++ - 将动态链接的 elf 二进制文件转换为静态链接

c++ - 帮助 C++ 中的对象

c++ - 删除此架构和未定义的行为

opencv - 在像MATLAB这样的opencv中显示图像

android - 使用 OpenCV 为 APK 复制文件

python - 在 Python 中查找单词的所有变体(或时态)

python - TensorBoard:如何绘制梯度直方图?

python - 在 Python 中使用 caffe.NetSpec() 时,train.prototxt 中的两个顶部 blob