gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:07 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

-> line 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 行 return 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 代码。 [讽刺]对我来说,它从第一次尝试开始就成功了。[/sarcasm]不过,一旦你理解了工作流程,你就可以通过在这两个地方放置断点来轻松调试它。如果您遇到问题,我很乐意提供更多帮助,所以如果您遇到困难,请告诉我。

关于c++ - 是否有任何 SVM 库支持可与 Visual Studio C++ 一起使用的自定义内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12376913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com