C++支持向量机(SVM)模板库

C++ support vector machine (SVM) template libraries?

本文关键字:SVM 支持 向量机 C++      更新时间:2023-10-16

我有一个来自自定义抽象对象的数据集和一个自定义距离函数。有没有什么好的SVM库可以让我在自定义对象(而不是二维点)和自定义距离函数上进行训练?

我在这个类似的stackoverflow问题中搜索了答案,但没有一个允许我使用自定义对象和距离函数。

第一件事。

SVM不适用于距离函数,它只接受点积。所以你的距离函数(实际上是相似的,但通常1距离是相似的)必须:

  • 对称s(a,b)=s(b,a)
  • 是正定s(a,a)>=0, s(a,a)=0 <=> a=0
  • 在第一个自变量s(ka, b) = k s(a,b)s(a+b,c) = s(a,c) + s(b,c)中是线性的

这可能很难检查,因为您实际上会问"是否有一个函数从我的对象到某个向量空间,phi使得s(phi(x), phi(y))"是一个点积,从而导致所谓的内核K(x,y)=s(phi(x), phi(y))的定义。如果对象本身就是向量空间的元素,那么有时将phi(x)=x设为K=s就足够了,但一般情况下这是不正确的。

一旦有了这种相似性,几乎任何SVM库(例如libSVM)都可以提供Gram矩阵。简称

G_ij = K(x_i, x_j)

因此需要CCD_ 10的内存和时间。因此,对象是什么并不重要,因为SVM只适用于成对点积,仅此而已。

如果您寻找合适的数学工具来显示此属性,那么可以做的就是从相似性中寻找内核学习。这些方法能够创建有效的内核,其行为与您的相似性相似。

查看以下内容:

  • MLPack:一个提供大量功能的轻量级库
  • DLib:一个非常流行的工具包,在工业界和学术界都有使用

除此之外,您还可以使用Python包,但可以从C++导入它们。