似乎每个 C++ 的 SVM 库都是
- 禁止自定义内核或
- Linux 独占,与 Visual Studio 一起使用将是一个巨大的痛苦。
当前是否有任何支持自定义内核并可在 Visual Studio(特别是 2010)中使用的 SVM 库?
似乎每个 C++ 的 SVM 库都是
当前是否有任何支持自定义内核并可在 Visual Studio(特别是 2010)中使用的 SVM 库?
就像我说的那样,根据您的需要修改 libsvm 很容易,这里是解释:http ://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f418
由于我不熟悉这两个内核,我只是从谷歌复制了公式。我希望我做对了:D
A. 直方图交叉核(太糟糕了,所以不渲染 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]不过,一旦你了解了工作流程,你就可以通过在这两个地方放置断点来轻松调试它。如果您遇到问题,我很乐意提供更多帮助,所以如果您遇到困难,请告诉我。