我必须训练支持向量机模型,并且我想使用自定义内核矩阵,而不是预设的矩阵(如 RBF、Poly 等)。
我怎样才能用opencv的机器学习库做到这一点(如果可能的话)?
谢谢你!
AFAICT,OpenCV 不直接支持 SVM 的自定义内核。看起来 LIBSVM(OpenCV 为此使用的底层库)没有提供定义自定义内核的特别简单的方法。因此,许多使用 LIBSVM 的包装器也不提供此功能。似乎有一些,例如用于Python的scikit:具有自定义内核的 SVM 的 scikit 示例
您还可以看一下完全不同的库,例如SVMlight。它直接支持自定义内核。还看一下这个问题。那里的答案包括一些 SVM 库,以及简短的评论。
如果您有令人信服的理由留在 OpenCV 中,您也许可以通过使用内核类型来完成它CvSVM::LINEAR
并在训练 SVM 之前将自定义内核应用于数据。我对这个方向是否会取得成果有点模糊,所以我希望有更多 SVM 经验的人能够插话并发表评论。如果它is可以通过选择“线性”作为内核来使用“预计算内核”,然后看看这个答案有关如何进行的更多想法。
您还可以考虑包含 LIBSVM 并直接调用它,而不使用 OpenCV。看LIBSVM 常见问题解答 #418,其中简要介绍了如何进行自定义内核:
问:我想使用我自己的内核。有什么例子吗?在 svm.cpp 中,有两个用于内核评估的子例程:k_function() 和 kernel_function()。我应该修改哪一项?
一个示例是 LIBSVM 工具中的“用于字符串数据的 LIBSVM”。
我们有两个函数的原因如下。对于RBF核exp(-g |xi - xj|^2),如果我们先计算xi - xj,然后计算范数平方,则有3n次运算。因此,我们考虑 exp(-g (|xi|^2 - 2dot(xi,xj) +|xj|^2)) 并通过在开始时计算所有 |xi|^2,操作次数减少到 2n。这是为了训练。对于预测,我们不能这样做,因此需要使用 3n 次操作的常规子例程。拥有自己的内核的最简单方法是通过替换任何内核将相同的代码放入这两个子例程中。
不过,最后一个选择听起来有点痛苦。我推荐 scikit 或 SVMlight。祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)