c++ - OpenCV 3.1.0 C++ 预测函数 RAW_OUTPUT 返回值有时是反的

标签 c++ machine-learning svm opencv3.1

我在 CV_32FC1 类型的 cv::Mat 对象 posSamples 和 negSamples 中提取正负描述符 vector 。每行对应一个 vector 。

我构造“样本”和“标签”cv::Mat 对象来训练 SVM。 (2类分类)

vconcat(posSamples, negSamples, samples);

cv::Mat posLabels = cv::Mat::ones(posSamples.rows, 1, CV_32SC1);
cv::Mat negLabels = cv::Mat::-ones(negSamples.rows, 1, CV_32SC1);
vconcat(posLabels, negLabels, labels);

我使用“样本”和“标签”构建数据:

auto data = cv::ml::TrainData::create(samples, cv::ml::ROW_SAMPLE, labels, cv::noArray(), cv::noArray(), cv::noArray(), cv::noArray());

然后我使用“数据”创建并训练 SVM:

auto svm = cv::ml::SVM::create();
svm->train(data);

然后我为查询调用预测函数。

auto score = svm->predict(newVector, cv::noArray(), cv::ml::StatModel::RAW_OUTPUT);

将标志设置为 RAW_OUTPUT“使方法返回原始结果(总和),而不是类标签”。 http://docs.opencv.org/3.1.0/dd/ded/group__ml.html#ggaf1ea864e1c19796e6264ebb3950c0b9aa639a8ea2b61c2bf03f87cf4c4a5bd824

我假设这意味着返回值是与分离超平面的有符号距离。

在这里,我希望正类样本的分值为正,负类样本的分值为负。在某些运行中,情况就是如此。正描述符 vector 产生高分(正分),负描述符 vector 产生低分(负分)。 SVM 以高性能对新数据进行分类。然而,在某些运行中,分值符号是相反的。 (负类为正类,负类为正类)。

如果它总是反向的,我会简单地通过将分数乘以“-1”(或反向标签)来处理它。然而,它不是确定性的。有时分数符号是相反的,有时不是。

我尝试更改连接顺序,但没有成功。

我做错了什么?

最佳答案

我将我的训练样本反馈回支持 vector 机并查看它们的决策值。如果负样本的平均决策值大于正样本的平均决策值,我会反转决策值。这暂时解决了问题。

决策值可以这样获取:

svm->predict(samples, resultsScore, true);

关于c++ - OpenCV 3.1.0 C++ 预测函数 RAW_OUTPUT 返回值有时是反的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42513694/

相关文章:

c++ - GoogleTest 仅在定义在 .h 文件中时有效

c++ - 是否有任何静态检查工具来检查这样的错误代码

c++ - 无论 T 是什么, std::bind(&T::memberFunc, this) 如何始终绑定(bind)到 std::function<void(void)> ?

python - 在 Python 中对距离矩阵进行聚类

python - 通过机器学习进行非常简单的文本分类?

python - 梯度下降未按预期工作

python - 哪些 svm python 模块使用 gpu?

machine-learning - 是否可以迭代地训练检测到误报的 SVM?

c++ - float 学精度,c++ vs fortran