Python中使用LibSVM的预计算核函数

11

我已经在网上搜索了大约3个小时,但是我还没有找到解决方案。我想将一个预先计算的核函数提供给libsvm并对数据集进行分类,但是:

  • 如何生成预先计算的核函数?(例如,Iris数据的基本预先计算核函数是什么?)

  • 在libsvm文档中,它说明:

    对于预先计算的核函数,每个实例的第一个元素必须是ID。例如,

            samples = [[1, 0, 0, 0, 0], [2, 0, 1, 0, 1], [3, 0, 0, 1, 1], [4, 0, 1, 1, 2]]
            problem = svm_problem(labels, samples)
            param = svm_parameter(kernel_type=PRECOMPUTED)
    
    什么是ID?没有更多的细节。我能按顺序分配ID吗?
    非常感谢任何关于libsvm的帮助以及预计算内核的示例。
    非常感谢任何关于libsvm的帮助以及预计算内核的示例。
4个回答

17
首先,关于核函数和支持向量机(SVM)的一些背景知识...
如果要为n个向量(任意维度)预计算一个核函数,需要计算每对示例之间的核函数。核函数接受两个向量并给出一个标量,因此您可以将预计算的核函数看作一个标量矩阵nxn。它通常称为核矩阵,有时也称为Gram矩阵。
有许多不同的核函数,最简单的是线性核函数(也称为点积): sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors 其次,试着回答你的问题... libsvm中有关预计算核函数的文档实际上非常好...
假设原始训练数据有三个四个特征实例,而测试数据有一个实例:
15 1:1 2:1 3:1 4:1 45 2:3 4:3 25 3:1 15 1:1 3:1
如果使用线性核函数,则我们有以下新的训练/测试集:
15 0:1 1:4 2:6 3:1 45 0:2 1:6 2:18 3:0 25 0:3 1:1 2:0 3:1
15 0:? 1:2 2:0 3:1

第二个例子中的每个向量都是核矩阵中的一行。索引零处的值是ID值,看起来只是一个连续计数。第一个向量中索引1处的值是第一个示例中与其本身的核函数值(即(1x1)+(1x1)+(1x1)+(1x1)=4),第二个值是第一个向量与第二个向量的核函数值(即(1x3)+(1x3)=6)。其余示例也是按此规律进行。您可以看到,核矩阵是对称的,因为K(x,y) = K(y,x)。

值得指出的是,第一组向量采用稀疏格式表示(即缺失值为零),但核矩阵不应该是稀疏的。我不知道为什么,这似乎只是一个libsvm的特性。


8
scikit-learn在处理自定义核函数时隐藏了大部分libsvm的细节。您可以将任意函数作为核函数传递,它会为您计算Gram矩阵,或者传递预先计算好的核函数Gram矩阵。
对于第一种情况,语法如下:
   >>> from scikits.learn import svm
   >>> clf = svm.SVC(kernel=my_kernel)

其中 my_kernel 是您的核函数,然后您可以调用 clf.fit(X, y) ,它将为您计算核矩阵。在第二种情况下,语法如下:

   >>> from scikits.learn import svm
   >>> clf = svm.SVC(kernel="precomputed")

当你调用clf.fit(X, y)时,X必须是矩阵k(X, X),其中k是你的核函数。更多细节请参见此示例:

http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html


4
这是一个简单的两类三向量自定义内核输入文件,可以正确地工作。我将解释其中的部分(尽管您还应该查看StompChicken的答案):
每行的第一个数字是它属于哪个类别。 每行的下一个条目为0:n形式,并且必须是连续的,即 第一项上的0:1 第二个条目上的0:2 第三个条目上的0:3
这样做的一个可能原因是libsvm在输出文件中返回与您的向量配对的alpha_i值,但是对于预先计算的内核,向量不会显示出来(这可能真的很大),而是显示了与该向量配对的索引0:n,以使您的输出更容易与您的输入匹配。特别是由于输出“不按您放置它们的顺序进行分组”,因此在阅读输入文件时能够将libsvm的输出与自己的输入配对非常有用。在这里您可以查看输出
svm_type c_svc kernel_type precomputed nr_class 2 total_sv 3 rho -1.53951 label 1 2 nr_sv 2 1 SV 0.4126650675419768 0:1 0.03174528241667363 0:3 -0.4444103499586504 0:2
需要注意的是,在预先计算的内核中,您不能像其他所有内核一样省略零条目。它们必须明确包含。

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接