1

我目前正在开发自己的内核以用于分类,并希望将其包含到 libsvm 中,以替换 libsvm 提供的标准内核。

然而,我不是 100% 确定如何做到这一点,而且显然不想犯任何错误。请注意,我的 c++ 不是很好。我在 libsvm 常见问题页面上找到了以下内容:

问:我想使用自己的内核。有什么例子吗?在 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 个操作的常规子程序。拥有自己的内核的最简单方法是通过替换任何内核将相同的代码放入这两个子例程中。

因此,我试图找到两个子路由 k_function() 和 kernel_function()。前者我在 svm.cpp 中找到了以下签名:

double Kernel::k_function(const svm_node *x, const svm_node *y,
              const svm_parameter& param)

我是否正确,x 和 y 各自将我的特征矩阵的一个观察值(= 行)存储在一个数组中,并且我需要返回内核值 k(x,y)?

另一方面,函数 kernel_function() 我根本找不到。Kernel 类中有一个具有该名称和以下声明的指针

double (Kernel::*kernel_function)(int i, int j) const; 

这是在内核构造函数中设置的。在那种情况下 i 和 j 是什么?我想我也需要设置这个指针?

一旦我覆盖了 Kernel::k_function 和 Kernel::*kernel_function 我就完成了,libsvm 会使用我的内核来比较两个观察结果吗?

谢谢!

4

1 回答 1

2

您不必闯入 LIBSVM 的代码来使用自己的内核,您可以使用预先计算的内核选项(即 -t 4 training_set_file)。

因此,您可以根据需要在外部计算内核矩阵,将值存储在文件中并将预先计算的内核加载到 LIBSVM。您可以在 LIBSVM tar ball 中找到的README文件中附有说明以及如何执行此操作的示例(请参阅预计算内核部分第 236 行)。

于 2013-12-30T19:11:32.327 回答