我在 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/