C++ 是否有支持可与Visual Studio C+一起使用的自定义内核的SVM库+;? 我们可以更改线性核并将其转换为此核,因此,基本上,在版本3.12(最新版本)中,在svm.cpp中:

C++ 是否有支持可与Visual Studio C+一起使用的自定义内核的SVM库+;? 我们可以更改线性核并将其转换为此核,因此,基本上,在版本3.12(最新版本)中,在svm.cpp中:,c++,visual-studio-2010,visual-studio,machine-learning,svm,C++,Visual Studio 2010,Visual Studio,Machine Learning,Svm,目前是否有支持自定义内核并可在Visual Studio(特别是2010)中使用的支持向量机库?正如我所说,根据需要修改libsvm很容易,下面是解释: 因为我不熟悉这两个内核,所以我只是从谷歌那里复制了公式。我希望我做对了:D A.直方图相交核(太糟糕了,所以不会渲染乳胶):SUM(min(x_i,y_i))->我们可以更改线性核并将其转换为此核,因此,基本上,在版本3.12(最新版本)中,在svm.cpp中: ->第233行返回点(x[i],x[j]);-您只需从Kernel::dot方法复

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

正如我所说,根据需要修改libsvm很容易,下面是解释:

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

A.直方图相交核(太糟糕了,所以不会渲染乳胶):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);-同上

卡方核:和((2x_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]不过,一旦你了解了工作流程,你可以通过在这两个地方设置断点来轻松调试它。如果您遇到问题,我很乐意提供更多帮助,所以如果您遇到问题,请告诉我。

您需要什么内核?在libsvm中,实现它们中的大多数都非常简单,尽管您必须更改库中的代码才能实现这一点非常烦人。卡方和直方图相交。超级容易实现的内核,但将它们添加到libsvm中似乎并不简单。太棒了,感谢您的参考和所有努力。这是修改libsvm的良好垫脚石。回答得很好。不客气:)(我不介意你也投票给我答案:P)