【问题标题】:Obtaining weights in CvSVM, the SVM implementation of OpenCV在 CvSVM 中获取权重,OpenCV 的 SVM 实现
【发布时间】:2013-02-08 14:42:39
【问题描述】:

我在 iOS 上使用 OpenCV 的 SVM 实现(基于 LibSVM)。训练后是否可以得到权重向量?

谢谢!

【问题讨论】:

    标签: ios opencv machine-learning computer-vision svm


    【解决方案1】:

    处理它之后,我已经能够获得权重。为了获得权重,必须首先获得支持向量,然后将它们与 alpha 值相乘。

    // get the svm weights by multiplying the support vectors by the alpha values
    int numSupportVectors = SVM.get_support_vector_count();
    const float *supportVector;
    const CvSVMDecisionFunc *dec = SVM.decision_func;
    svmWeights = (float *) calloc((numOfFeatures+1),sizeof(float));
    for (int i = 0; i < numSupportVectors; ++i)
    {
        float alpha = *(dec[0].alpha + i);
        supportVector = SVM.get_support_vector(i);
        for(int j=0;j<numOfFeatures;j++)
            *(svmWeights + j) += alpha * *(supportVector+j);
    }
    *(svmWeights + numOfFeatures) = - dec[0].rho; //Be careful with the sign of the bias!
    

    这里唯一的技巧是实例变量float *decision_function在opencv框架上受到保护,所以我必须更改它才能访问它。

    【讨论】:

    • 你所说的“改变它”是什么意思。您是否通过公开 decision_function() 来重新编译 OpenCV?
    • 是的!我将其公开并重新编译库。
    • 您可以创建一个新类并通过 CvSVM 对其进行扩展。所以不用重新编译就可以使用float *decision_function
    【解决方案2】:

    粗略浏览一下文档和源代码 (https://github.com/Itseez/opencv/blob/master/modules/ml/src/svm.cpp) 告诉我,表面上答案是“否”。超平面参数似乎隐藏在 CvSVMSolver 类中。 CvSVM 包含一个名为“求解器”的类对象。看看你能不能联系到它的成员。

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 2015-01-12
      • 1970-01-01
      • 2012-08-12
      • 2019-10-24
      • 2020-08-29
      • 2014-04-15
      • 1970-01-01
      • 2015-01-08
      相关资源
      最近更新 更多