繁体   English   中英

在libsvm中使用我自己的内核

[英]Using my own kernel in libsvm

我目前正在开发自己的内核以用于分类,并希望将其包含在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分别将我的特征矩阵的一个观测值(= row)存储在一个数组中,并且我需要返回内核值k(x,y)吗?

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

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

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

一旦我重写了Kernel :: k_function和Kernel :: ** kernel_function,我将完成工作,而libsvm将使用我的内核来比较两个观察结果?

谢谢!

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

因此,您可以根据需要从外部计算内核矩阵,将值存储在文件中,然后将预先计算的内核加载到LIBSVM。 在LIBSVM tar球中的README文件中有一个说明以及如何执行此操作的示例(请参见“ 预先计算的内核”部分第236行 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM