4

似乎每个 C++ 的 SVM 库都是

  1. 禁止自定义内核或
  2. Linux 独占,与 Visual Studio 一起使用将是一个巨大的痛苦。

当前是否有任何支持自定义内核并可在 Visual Studio(特别是 2010)中使用的 SVM 库?

4

1 回答 1

9

就像我说的那样,根据您的需要修改 libsvm 很容易,这里是解释:http ://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f418

由于我不熟悉这两个内核,我只是从谷歌复制了公式。我希望我做对了:D

A. 直方图交叉核(太糟糕了,所以不渲染 Latex):SUM(min(x_i, y_i)) -> 我们可以改变线性核并将其转换成这个,所以,基本上,在 3.12 版中(最新版本),在 svm.cpp 中:

-> 第 233 行返回点(x[i],x[j]);- 你只需要从 Kernel::dot 方法中复制代码并相应地改变它,所以是这样的:

double sum = 0;
while(x->index != -1 && y->index != -1)
{
    if(x->index == y->index)
    {
        sum += min(x->value, y->value);
        ++x;
        ++y;
    }
    else
    {
        if(x->index > y->index)
            ++x;
        else
            ++y;
    }           
}
return sum;

(对于普通测试文件,x 应该与 y 具有相同的长度。我认为当测试或模型文件包含值为 0 的属性时,else 分支存在于特殊情况下,可以省略,但如果 libsvm 产生预期的结果线性内核,那么修改后的内核也可以正常工作)

-> 第 322 行返回点(x,y);- 同上

B. 卡方核:SUM((2 x_i y_i) / (x_i + y_i)) - 好吧,让我们看看...我想我们可以再次尝试修改线性核(也许RBF的一些优化可以是在这种情况下被利用,但现在让我们忽略它):

-> 第 233 行变为:

double sum = 0;
while(x->index != -1 && y->index != -1)
{
    if(x->index == y->index)
    {
        sum += 2 * x->value * y->value / (x->value + y->value);
        ++x;
        ++y;
    }
    else
    {
        if(x->index > y->index)
            ++x;
        else
            ++y;
    }           
}
return sum;

-> 第 322 行 - 同上

PS:以上代码是用记事本写的,未经测试。如果它不起作用,请不要杀我,你必须花两周时间调试神秘的 C 代码。[讽刺]对我来说,它从第一次尝试就起作用了。[/sarcasm]不过,一旦你了解了工作流程,你就可以通过在这两个地方放置断点来轻松调试它。如果您遇到问题,我很乐意提供更多帮助,所以如果您遇到困难,请告诉我。

于 2012-09-11T21:35:52.110 回答