似乎每个C++的SVM库都要么不允许自定义核函数,要么只支持Linux平台,使用Visual Studio会非常麻烦。
- 有没有现成的SVM库支持自定义核函数,并且可以在Visual Studio(特别是2010版)中使用?
似乎每个C++的SVM库都要么不允许自定义核函数,要么只支持Linux平台,使用Visual Studio会非常麻烦。
就像我说的那样,修改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;
-> 第 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代码,请不要杀了我。[讽刺]对我来说,第一次尝试就成功了。[/讽刺]然而,一旦您理解了工作流程,您可以轻松地调试它,只需在这两个位置设置断点即可。如果遇到问题,我很乐意提供更多帮助,所以如果您卡住了,请告诉我。