【问题标题】:Using my own kernel in libsvm在 libsvm 中使用我自己的内核
【发布时间】:2013-06-21 04:43:32
【问题描述】:

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

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

问:我想使用我自己的内核。有什么例子吗?在 svm.cpp 中,有 是内核评估的两个子程序:k_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 会使用我的内核来比较两个观察结果?

谢谢!

【问题讨论】:

    标签: machine-learning libsvm svm


    【解决方案1】:

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

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

    【讨论】:

    • 嗨!是的,谢谢,这就是我最终做的。不幸的是,它更容易,但也可能慢得多:(
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2015-06-17
    • 2011-12-04
    • 2012-06-14
    • 2021-07-20
    • 2015-01-16
    • 2014-05-16
    相关资源
    最近更新 更多