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