【问题标题】:How to get the separating hyperplane in OpenCV SVM?如何在 OpenCV SVM 中获得分离超平面?
【发布时间】:2016-02-21 21:33:50
【问题描述】:

我正在尝试获取与 SVM 关联的超平面。为简单起见,我们假设example in OpenCV's page

在这里,他们通过以下方式使用样本输出集合构建“图像”:

// Show the decision regions given by the SVM
Vec3b green(0,255,0), blue (255,0,0);
for (int i = 0; i < image.rows; ++i)
{
    for (int j = 0; j < image.cols; ++j)
    {
        Mat sampleMat = (Mat_<float>(1,2) << j,i);
        float response = svm->predict(sampleMat);

        if (response == 1)
            image.at<Vec3b>(i,j)  = green;
        else if (response == -1)
            image.at<Vec3b>(i,j)  = blue;
    }
}

绿色和蓝色类之间的线显示为分离超平面。

现在,我的问题是:如何将这条线作为点向量或 cv::Mat 获取以进行进一步处理?

【问题讨论】:

  • 您需要从图像中找出超平面坐标,还是从 svm 参数中找出数学上的坐标?
  • 数学上来自 SVM 参数。

标签: c++ opencv svm


【解决方案1】:

您可以使用 getSupportVector 函数来检索支持向量,并使用 getDecisionFunction 函数来检索决策函数的标量偏差。

我假设您只需要线性 svm 的分离边界,因为非线性情况要复杂得多。

在这种情况下,分离平面由 W*X+b=0 类型的方程给出。 你可以很容易地找到 W 和 b 参数:所有支持向量的总和给你 W,b 是 getDecisionFunction(0) 返回的值。

计算 W 向量的代码应如下所示(未经测试):

    Mat W(sv.cols, 1, CV_32F, 0);
    for(int r=0; r<sv.rows; ++r)
    {
        for(int c=0; c<sv.cols; ++c)
        {
            W.at<float>(c)+=sv.at<float>(r,c);
        }
    }

一旦你有了线的方程,在 OpenCV 示例的情况下,你可以通过执行以下操作(同样,未经测试)将其显示在图像上:

    Point pt1(0, b/W.at<float>(1));
    Point pt2(b/W.at<float>(0));
    line(image, pt1, pt2, color);

pt1、pt2 点来自 x=0 和 y=0 的直线方程。

【讨论】:

  • 感谢您的回答。我一直在寻找 cv::SVM 类的加权支持向量,我意识到在新的 3.0 API 中,getSupportVectors() 自己给出了加权支持向量。
猜你喜欢
  • 2016-12-04
  • 2016-07-20
  • 2020-07-07
  • 1970-01-01
  • 2014-07-13
  • 2013-10-27
  • 2015-11-02
  • 2014-04-25
  • 2021-03-09
相关资源
最近更新 更多