【问题标题】:how to predict second class which is more close to test data如何预测更接近测试数据的第二类
【发布时间】:2015-03-08 02:11:37
【问题描述】:

我正在使用 opencv-2.4 (CvSVM) 进行分类。对于每个测试数据,它都将一个类预测为预测输出。但是我需要找到下一个更接近测试数据的类。 有没有办法在 opencv SVM 分类器中找到它??

【问题讨论】:

  • 有一个选项可以在predict() 中获取签名的 DF 值。这就是你想要的吗?
  • 不,假设我有一个测试数据,SVM 预测它属于 t0 类5。下一个更接近相同测试数据的类可能是S。所以我需要找到这个..

标签: opencv svm


【解决方案1】:

很遗憾,您不能直接使用当前界面进行操作。 一种解决方案是改用库 libsvm

你可以在opencv中做,但需要一点工作。

首先,你必须知道 OpenCV 使用"1-against-1" 策略进行多类分类。 对于 N 类问题,它将训练 N*(N-1)/2 二元分类器(每对类一个),然后使用多数票来选择最可能的类。

您必须应用每个分类器,并自己完成大部分工作以获得您想要的。

下面的代码向您展示了如何使用 OpenCV 3 执行此操作(警告:它未经测试,可能包含错误,但它为您提供了一个很好的起点)。

Ptr<SVM> svm;
int N;            //number of classes
Mat data;         //input data to classify

Mat sv=svm->getSupportVectors();
Ptr<Kernel> kernel=svm->getKernel();
Mat buffer(1,sv.rows,CV_32F);
kernel->calc(sv.rows, sv.cols , sv.ptr<float>(), data.ptr<float>(), buffer.ptr<float>());  // apply kernel on data (CV_32F vector) and support vectors

Mat alpha, svidx;
vector<int> votes(N, 0);  // results of majority vote will be stored here

int i, j, dfi;
for( i = dfi = 0; i < N; i++ ) 
{
    for( j = i+1; j < N; j++, dfi++ )
    {
        // compute score for each binary svm
        double rho=svm->getDecisionFunction(dfi, alpha, svidx);
        double sum = -rho;
        for( k = 0; k < sv.rows; k++ )
            sum += alpha.at<float>(k)*buffer.at<float>(svidx.at<int>(k));
        // majority vote
        votes[sum > 0 ? i : j]++;
    }
}

编辑:这段代码改编自Opencvhere的内部代码。 正如 David Doria 在 cmets 中指出的那样,这是不正确的,因为在 SVM 类中没有定义 getKernel 函数。我还是把它留在这里,因为修改内部 OpenCV 代码添加它应该不会太难,而且显然没有其他方法可以做到。

【讨论】:

  • getDecisionFunction() 在 opencv 中可用??
  • 你是对的,它在 opencv 2.4 中不可用,我确实使用了 git 版本。不过,它在 opencv 3.0 beta 中可用。我不认为不修改库内部就可以在opencv2.4中做到这一点。
  • 当然,您也可以使用 1-vs-1 或 1-vs-rest 策略训练自己的二元分类器。
  • @AdrienDescamps 我认为vote[...] 也应该是votes[...]?你能解释一下正在发生的事情吗?为什么它从-rho 开始?我是否也正确,您只是在计算每个班级的投票数,让原始发布者取第二大值的索引来真正回答他的问题?
  • @AdrienDescamps getKernel() 似乎不再是SVM 的成员了? docs.opencv.org/3.0-beta/modules/ml/doc/…
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2013-11-25
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多