我需要训练一个支持向量机模型,我想使用自定义的核矩阵,而不是预设的核(如RBF、Poly等)。我能否使用opencv的机器学习库来实现这一点(如果可能的话)?
谢谢你!
回答:
据我所知,OpenCV并不直接支持SVM的自定义核。这是因为OpenCV所使用的底层库LIBSVM,并没有提供定义自定义核的简单方法。因此,许多使用LIBSVM的封装库也不提供这一功能。似乎有一些例外,例如Python的scikit:scikit的SVM自定义核示例
你也可以看看完全不同的库,比如SVMlight。它直接支持自定义核。另外,你可以参考这个Stack Overflow问题。那里的回答包括了一些SVM库及其简短的评论。
如果你有充分的理由坚持使用OpenCV,你可以通过使用CvSVM::LINEAR
核类型,并在训练SVM之前将你的自定义核应用于数据来实现这一点。我对这个方向是否有成效有点不确定,所以我希望有更多SVM经验的人能发表评论。如果通过选择“线性”作为你的核类型确实可以使用“预计算核”,那么请参考这个回答,以获取更多关于如何进行的想法。
你还可以考虑直接包含LIBSVM并调用它,而不使用OpenCV。请参阅LIBSVM的FAQ #418,它简要介绍了如何进行自定义核:
问:我想使用我自己的核。有例子吗?在svm.cpp中,有两个用于核评估的子程序:k_function()和kernel_function()。我应该修改哪一个?
一个例子是LIBSVM工具中的“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。祝你好运!