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

时间:2015-12-11 07:24:17

标签: c++ machine-learning classification svm

我有自定义抽象对象和自定义距离函数的数据集。是否有任何好的SVM库允许我训练我的自定义对象(不是2d点)和我的自定义距离函数?

我搜索了this similar stackoverflow question中的答案,但没有一个允许我使用自定义对象和距离函数。

2 个答案:

答案 0 :(得分:3)

首先要做的事情。

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))”是一个点积,从而导致所谓的< strong>内核,K(x,y)=s(phi(x), phi(y))。如果你的对象本身就是向量空间的元素,那么有时将phi(x)=x放到K=s就足够了,但一般情况下它并不正确。

一旦你有这种相似性,几乎任何SVM库(例如libSVM)都可以提供 Gram矩阵。这被简单地定义为

G_ij = K(x_i, x_j)

因此需要O(N^2)记忆和时间。因此,您的对象无关紧要,因为SVM仅适用于成对点产品,仅此而已。

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

答案 1 :(得分:2)

查看以下内容:

  • MLPack:提供许多功能的轻量级库。
  • DLib:一个非常流行的工具包,可用于工业和学术界。

除了这些,您还可以使用Python程序包,但可以从C ++导入它们。