我有自定义抽象对象和自定义距离函数的数据集。是否有任何好的SVM库允许我训练我的自定义对象(不是2d点)和我的自定义距离函数?
我搜索了this similar stackoverflow question中的答案,但没有一个允许我使用自定义对象和距离函数。
答案 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)