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

时间:2017-02-28 16:12:50

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

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

我构造“samples”和“labels”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

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

在这里,我预计正分类的样本得分值为正,而负分类的样本则为负。在某些运行中,情况就是这样。正描述符向量产生高分(正分数),负描述符向量产生低分数(负分数)。 SVM以高性能对新数据进行分类。但是在某些运行中,得分值符号是反向的。 (积极类为负,负类为正)。

如果它总是反向的,我只需将得分乘以“-1”(或反向标记)来处理它。然而,这不是确定性的。有时分数符号是反向的,有时不是。

我尝试更改连接顺序,但它不起作用。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我将我的训练样本送回svm并查看它们的决策值。如果负样本的平均判定值大于正样本的平均判定值,则将判定值反转。这解决了现在的问题。

决策值可以这样获得:

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