有哪些SVM库支持自定义核函数并可用于Visual Studio C++?

4

似乎每个C++的SVM库都要么不允许自定义核函数,要么只支持Linux平台,使用Visual Studio会非常麻烦。

  1. 有没有现成的SVM库支持自定义核函数,并且可以在Visual Studio(特别是2010版)中使用?

你需要哪个核函数? 在libsvm中,实现大多数核函数非常简单,尽管你必须更改库内部的代码才能完成它。 - Mihai Todor
卡方核和直方图交集是非常容易实现的核函数,但似乎在libsvm中添加它们并不是一件简单的事情。 - zebra
1个回答

9

就像我说的那样,修改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行 return dot(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 长度相同。我认为 else 分支存在的特殊情况是测试或模型文件包含值为 0 的属性,可以忽略,但如果 libsvm 用线性内核产生预期的结果,那么这个修改后的方法也将正常工作)

-> 第 322 行返回 dot(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代码,请不要杀了我。[讽刺]对我来说,第一次尝试就成功了。[/讽刺]然而,一旦您理解了工作流程,您可以轻松地调试它,只需在这两个位置设置断点即可。如果遇到问题,我很乐意提供更多帮助,所以如果您卡住了,请告诉我。


1
太棒了,感谢您提供的参考和所有的努力。这是修改libsvm的好起点。非常好的答案。 - zebra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接