使用OpenCV构建自定义SVM核矩阵

8
我需要训练一个支持向量机模型,并且想要使用自定义的核矩阵,而不是预设的核函数(例如RBF、Poly等)。如果可能的话,我该如何在OpenCV的机器学习库中实现呢?
谢谢!
2个回答

8
据我所知,在OpenCV中直接不支持SVM的定制内核。看起来OpenCV用于此的底层库LIBSVM并没有提供定义自定义内核的特别简单的方法。因此,许多使用LIBSVM的包装器也不提供此功能。有一些选择,例如Python的scikit:带有自定义内核的SVM的scikit示例
您还可以查看完全不同的库,例如SVMlight。它直接支持自定义内核。还要查看这个SO问题。那里的答案包括几个SVM库和简短的评论。
如果您有充分的理由留在OpenCV中,则可以使用内核类型CvSVM :: LINEAR并在训练SVM之前将自定义内核应用于数据。我对是否应该采取这个方向有点模糊,所以我希望有更多SVM经验的人能够发表评论。如果可以通过选择“线性”作为内核来使用“预计算内核”,那么请查看此答案以获取更多有关如何继续的想法。
您还可以考虑包括LIBSVM并直接调用它,而不使用OpenCV。请参见LIBSVM的FAQ#418,其中简要介绍了如何进行自定义内核:

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

一个示例是“ LIBSVM for string data”,位于LIBSVM Tools中。

我们有两个函数的原因如下。对于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中使用预编译的内核 :( - Carlo Pane

2

如果你不是非常依赖OpenCV的SVM功能,可以看一下shogun工具箱......里面有很多SVM技巧。


Shogun看起来很不错。谢谢分享! - justis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接