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

我需要训练一个支持向量机模型,我想使用自定义的核矩阵,而不是预设的核(如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。祝你好运!

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注