C++ 支持向量机 (SVM) 模板库?
C++ support vector machine (SVM) template libraries?
我有一个来自自定义抽象对象的数据集和一个自定义距离函数。是否有任何好的 SVM 库允许我训练我的自定义对象(不是 2d 点)和我的自定义距离函数?
我在 this similar Whosebug question 中搜索了答案,但其中 none 允许我使用自定义对象和距离函数。
要事第一。
SVM 不适用于距离函数,它只接受点积。所以你的距离函数(实际上是相似度,但通常 1-distance 是相似度)必须:
- 对称
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)
中是线性的
这可能很难检查,因为你实际上问 "is there a function from my objects to some vector space, phi such that s(phi(x), phi(y))
" 是一个点积,因此导致所谓的 kernel、[=16= 的定义].如果你的对象本身就是vectorspace的元素,那么有时候把phi(x)=x
这样K=s
就够了,但一般情况下不是这样的。
一旦你有了这种相似性,几乎任何 SVM 库(例如 libSVM
)都可以提供 Gram 矩阵。简单定义为
G_ij = K(x_i, x_j)
因此需要 O(N^2)
内存和时间。因此,您的对象是什么并不重要,因为 SVM 仅适用于 成对点积 ,仅此而已。
如果您寻找合适的数学工具来证明这一点 属性,可以做的是寻找从相似性中学习的内核。这些方法能够创建行为类似于您的相似性的有效内核。
查看以下内容:
除此之外,您还可以使用 Python 包,但要从 C++ 导入它们。
我有一个来自自定义抽象对象的数据集和一个自定义距离函数。是否有任何好的 SVM 库允许我训练我的自定义对象(不是 2d 点)和我的自定义距离函数?
我在 this similar Whosebug question 中搜索了答案,但其中 none 允许我使用自定义对象和距离函数。
要事第一。
SVM 不适用于距离函数,它只接受点积。所以你的距离函数(实际上是相似度,但通常 1-distance 是相似度)必须:
- 对称
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)
中是线性的
这可能很难检查,因为你实际上问 "is there a function from my objects to some vector space, phi such that s(phi(x), phi(y))
" 是一个点积,因此导致所谓的 kernel、[=16= 的定义].如果你的对象本身就是vectorspace的元素,那么有时候把phi(x)=x
这样K=s
就够了,但一般情况下不是这样的。
一旦你有了这种相似性,几乎任何 SVM 库(例如 libSVM
)都可以提供 Gram 矩阵。简单定义为
G_ij = K(x_i, x_j)
因此需要 O(N^2)
内存和时间。因此,您的对象是什么并不重要,因为 SVM 仅适用于 成对点积 ,仅此而已。
如果您寻找合适的数学工具来证明这一点 属性,可以做的是寻找从相似性中学习的内核。这些方法能够创建行为类似于您的相似性的有效内核。
查看以下内容:
除此之外,您还可以使用 Python 包,但要从 C++ 导入它们。