是否有支持可与Visual Studio C ++一起使用的自定义内核的SVM库?

时间:2012-09-11 19:52:40

标签: c++ visual-studio-2010 visual-studio machine-learning svm

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

  1. 禁止使用自定义内核或
  2. Linux独家,与Visual Studio一起使用会很神圣。
  3. 目前是否有支持自定义内核的SVM库可用于Visual Studio(特别是2010)?

1 个答案:

答案 0 :(得分:9)

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

由于我不熟悉这两个内核,我只是从Google复制了公式。我希望我把它们弄好:D

一个。直方图交集核(太糟糕的SO不会渲染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]对我而言,这是第一次尝试。[/ sarcasm]然而,一旦你理解了工作流程,你可以通过在这两个地方放置断点来轻松调试它。如果您遇到问题,我很乐意提供更多帮助,所以如果您遇到问题,请告诉我。