在libsvm中使用我自己的内核

时间:2013-06-24 15:39:56

标签: machine-learning libsvm svm

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

然而,我不是百分百肯定如何做到这一点,显然不想犯任何错误。请注意,我的c ++不是很好。我在libsvm faq-page上找到了以下内容:

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

因此,我试图找到两个subroutinges 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; 

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

因此,您可以在外部计算内核矩阵,因为它适合您,将值存储在文件中并将预先计算的内核加载到LIBSVM。有一个解释,附带一个如何在README文件中执行此操作的示例,您可以在LIBSVM tar ball中找到该文件(请参阅预先计算的内核部分第236行)。