我在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”(或反向标记)来处理它。然而,这不是确定性的。有时分数符号是反向的,有时不是。
我尝试更改连接顺序,但它不起作用。
我做错了什么?
答案 0 :(得分:0)
我将我的训练样本送回svm并查看它们的决策值。如果负样本的平均判定值大于正样本的平均判定值,则将判定值反转。这解决了现在的问题。
决策值可以这样获得:
svm->predict(samples, resultsScore, true);