似乎每个C ++的SVM库都是
目前是否有支持自定义内核的SVM库可用于Visual Studio(特别是2010)?
答案 0 :(得分:9)
就像我说的那样,根据你的需要修改libsvm很容易,这里有解释:http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f418
由于我不熟悉这两个内核,我只是从Google复制了公式。我希望我把它们弄好:D
一个。直方图交集核(太糟糕的SO不会渲染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]对我而言,这是第一次尝试。[/ sarcasm]然而,一旦你理解了工作流程,你可以通过在这两个地方放置断点来轻松调试它。如果您遇到问题,我很乐意提供更多帮助,所以如果您遇到问题,请告诉我。