我目前正在开发自己的内核用于分类,并希望将其包含在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会使用我的内核来比较两个观察结果吗?
谢谢!
答案 0 :(得分:2)
您不必闯入LIBSVM的代码来使用您自己的内核,您可以使用预先计算的内核选项(即-t 4 training_set_file)。
因此,您可以在外部计算内核矩阵,因为它适合您,将值存储在文件中并将预先计算的内核加载到LIBSVM。有一个解释,附带一个如何在README文件中执行此操作的示例,您可以在LIBSVM tar ball中找到该文件(请参阅预先计算的内核部分第236行)。