使用opencv构建自定义svm内核矩阵

时间:2012-03-17 17:59:34

标签: opencv machine-learning classification svm

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

谢谢!

2 个答案:

答案 0 :(得分:8)

AFAICT,OpenCV中不直接支持SVM的自定义内核。它看起来像LIBSVM,它是OpenCV用于此的底层库,不提供定义自定义内核的特别简单的方法。因此,许多使用LIBSVM的包装器也没有提供。似乎有一些,例如scikit for python: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然后再计算norm square,则有3n个运算。因此我们考虑exp(-g(| xi | ^ 2 - 2dot(xi,xj)+ | xj | ^ 2))并且通过在开始时计算所有| xi | ^ 2,操作次数减少到2n。这是为了培训。对于预测,我们不能这样做,因此需要使用该3n操作的常规子例程。拥有自己的内核的最简单方法是通过替换任何内核将相同的代码放在这两个子例程中。

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

答案 1 :(得分:2)

如果您没有与OpenCV结合使用SVM,请查看the shogun toolbox ...那里有很多SVM伏都教。