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

Posted

技术标签:

【中文标题】C++ 支持向量机 (SVM) 模板库?【英文标题】:C++ support vector machine (SVM) template libraries? 【发布时间】:2016-03-17 01:08:57 【问题描述】:

我有一个来自自定义抽象对象的数据集和一个自定义距离函数。是否有任何好的 SVM 库可以让我在自定义对象(不是 2d 点)和自定义距离函数上进行训练?

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

【问题讨论】:

【参考方案1】:

首先要做的事情。

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)=xK=s 就足够了,但一般情况下并非如此。

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

G_ij = K(x_i, x_j)

因此需要O(N^2) 内存和时间。因此,您的对象是什么并不重要,因为 SVM 仅适用于成对点积,仅此而已。

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

【讨论】:

谢谢。实际上我的“对象”是样本(每个都是一组样本值),而我的“距离函数”是两组样本之间的相似性度量,因此它是对称且正定的,但我不确定关于第一个参数中的线性,因为我无法定义加法和乘法运算。 线性是最难的部分。您可以做的是尝试检查经验。创建所有成对相似性的矩阵并检查它是否是 PSD 矩阵。【参考方案2】:

查看以下内容:

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

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

【讨论】:

以上是关于C++ 支持向量机 (SVM) 模板库?的主要内容,如果未能解决你的问题,请参考以下文章

HanLP 基于SVM支持向量机 训练 文本分类

HanLP 基于SVM支持向量机 训练 文本分类

支持向量机优缺点?

6.支持向量机(SVM)什么是SVM支持向量机基本原理与思想基本原理课程中关于SVM介绍

基于并联SVM支持向量机训练HOG特征提取的人员目标提取

机器学习速成宝典模型篇08支持向量机SVM(附python代码)