【问题标题】:Are there any SVM libraries that support custom kernels that can be used with Visual Studio C++?是否有任何支持可与 Visual Studio C++ 一起使用的自定义内核的 SVM 库?
【发布时间】:2012-09-04 19:24:24
【问题描述】:

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

  1. 禁止自定义内核或
  2. Linux 独有,与 Visual Studio 一起使用会非常痛苦。

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

【问题讨论】:

  • 你需要什么内核?在 libsvm 中,实现它们中的大多数都非常简单,尽管您必须更改库中的代码才能做到这一点非常烦人。
  • 卡方和直方图相交。超级容易实现的内核,但将它们添加到 libsvm 中似乎并不简单。

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


【解决方案1】:

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

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

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

-> 第 233 行返回 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 行返回点(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] 然而,一旦你理解了工作流程,你就可以通过在这两个地方设置断点来轻松调试它。如果您遇到问题,我很乐意提供更多帮助,所以如果您遇到问题,请告诉我。

【讨论】:

  • 太棒了,感谢您的参考和所有的努力。这是修改 libsvm 的一个很好的垫脚石。很好的答案。
  • 不客气 :) (我不介意你是否也支持答案:P)
猜你喜欢
  • 2020-10-14
  • 2015-05-08
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2011-01-15
  • 1970-01-01
相关资源
最近更新 更多