繁体   English   中英

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

[英]Are there any SVM libraries that support custom kernels that can be used with Visual Studio C++?

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

  1. 不允许自定义内核或
  2. Linux独占并且与Visual Studio一起使用会很神圣。

是否有任何支持自定义内核的SVM库可用于Visual Studio(特别是2010)?

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

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

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

暂无
暂无

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

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