使用Python中的LibSVM预先计算的内核

Lyy*_*yli 9 python machine-learning libsvm

我一直在网上搜索约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)
    
    Run Code Online (Sandbox Code Playgroud)

我所说?没有进一步的细节.我可以按顺序分配ID吗?

任何libsvm帮助和预先计算的内核的例子都非常受欢迎.

Sto*_*ken 16

首先,内核和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中预先计算的内核的文档实际上非常好......

Assume the original training data has three four-feature instances 
and testing data has one instance:

15  1:1 2:1 3:1 4:1
45      2:3     4:3
25          3:1
15  1:1     3:1

If the linear kernel is used, we have the following 
new training/testing sets:

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的东西.


Fab*_*osa 6

scikit-learn在处理自定义内核时隐藏了libsvm的大部分细节.您可以将任意函数作为内核传递,它将为您计算克矩阵或传递内核的预先计算的Gram矩阵.

对于第一个,语法是:

   >>> from scikits.learn import svm
   >>> clf = svm.SVC(kernel=my_kernel)
Run Code Online (Sandbox Code Playgroud)

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

   >>> from scikits.learn import svm
   >>> clf = svm.SVC(kernel="precomputed")
Run Code Online (Sandbox Code Playgroud)

当你调用clf.fit(X,y)时,X必须是矩阵k(X,X),其中k是你的内核.有关更多详细信息,请参阅此示例:

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