【发布时间】: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