【问题标题】:Build a custom svm kernel matrix with opencv使用 opencv 构建自定义 svm 内核矩阵
【发布时间】:2012-04-02 21:20:58
【问题描述】:

我必须训练一个支持向量机模型,并且我想使用自定义内核矩阵,而不是预设的内核矩阵(如 RBF、Poly 等)。 我如何使用 opencv 的机器学习库来做到这一点(如果可能的话)?

谢谢!

【问题讨论】:

    标签: opencv machine-learning classification svm


    【解决方案1】:

    如果您没有为 SVM 的东西与 OpenCV 结婚,请查看 the shogun toolbox ... 那里有很多 SVM 巫术。

    【讨论】:

    • 幕府将军看起来不错。感谢分享!
    【解决方案2】:

    AFAICT,OpenCV 不直接支持 SVM 的自定义内核。看起来 LIBSVM(OpenCV 用于此目的的底层库)并没有提供一种特别简单的方法来定义自定义内核。因此,许多使用 LIBSVM 的包装器也不提供此功能。似乎有一些,例如用于 python 的 scikit:scikit example of SVM with custom kernel

    您还可以查看一个完全不同的库,例如 SVMlight。它直接支持自定义内核。也看看this SO question。那里的答案包括一些 SVM 库,以及简短的评论。

    如果您有令人信服的理由留在 OpenCV,您可以通过使用内核类型 CvSVM::LINEAR 并在训练 SVM 之前将您的自定义内核应用于数据来完成它。我对这个方向是否会取得成果有点模糊,所以我希望有更多 SVM 经验的人可以加入并发表评论。如果通过选择“线性”作为您的内核可以使用“预计算内核”,请查看this answer 以了解有关如何继续的更多想法。

    您也可以考虑包含 LIBSVM 并直接调用它,而不使用 OpenCV。请参阅FAQ #418 for LIBSVM,其中简要介绍了如何进行自定义内核:

    问:我想使用我自己的内核。有什么例子吗?在 svm.cpp 中,有两个内核评估子程序:k_function() 和 kernel_function()。我应该修改哪一个?

    一个例子是 LIBSVM Tools 中的“LIBSVM for string data”。

    我们有两个函数的原因如下。对于 RBF 核 exp(-g |xi - xj|^2),如果我们先计算 xi - xj 再计算范数平方,则有 3n 次操作。因此,我们考虑 exp(-g (|xi|^2 - 2dot(xi,xj) +|xj|^2)) 并在开始时计算所有 |xi|^2,操作数减少到 2n。这是为了训练。对于预测,我们不能这样做,因此需要使用 3n 个操作的常规子程序。拥有自己的内核的最简单方法是通过替换任何内核将相同的代码放入这两个子例程中。

    不过,最后一个选项听起来有点痛苦。我推荐 scikit 或 SVMlight。祝你好运!

    【讨论】:

    • 非常感谢您的完整回答!顺便说一句,我想我会直接使用 LibSVM ......似乎没有办法将预编译内核与 OpenCV 一起使用:(
    猜你喜欢
    • 2015-01-13
    • 2014-05-08
    • 2018-03-07
    • 1970-01-01
    • 2015-06-02
    • 2013-09-15
    • 2016-09-07
    • 2016-01-21
    • 2021-12-03
    相关资源
    最近更新 更多