Libsvm 预计算内核

Posted

技术标签:

【中文标题】Libsvm 预计算内核【英文标题】:Libsvm precomputed kernels 【发布时间】:2012-06-14 05:58:59 【问题描述】:

我正在使用带有预计算内核的 libsvm。我为示例数据集 heart_scale 生成了一个预先计算的内核文件,并执行了函数svmtrain()。它工作正常并且支持向量被正确识别,即类似于标准内核。

但是,当我尝试运行 svmpredict() 时,它为预先计算的模型文件提供了不同的结果。在挖掘代码后,我注意到svm_predict_values() 函数需要支持向量的实际特征,这在预计算模式下是不可用的。在预计算模式下,我们只有每个支持向量的系数和索引,被svmpredict()误认为是它的特征。

这是一个问题还是我错过了什么。

(请告诉我如何在预计算模式下运行svmpredict()。)

【问题讨论】:

据我记得,如果您使用预先计算的内核来训练 SVM,则必须手动预测值。 【参考方案1】:

测试集向量x和每个训练集向量之间的核评估值应作为测试集特征向量。

以下是 libsvm 自述文件中的相关行:

xi 的新训练实例: 0:i 1:K(xi,x1) ... L:K(xi,xL)

任何 x 的新测试实例: 0:? 1:K(x,x1) ... L:K(x,xL)

libsvm 自述文件是说,如果你有 L 个训练集向量,其中 xi 是一个训练集向量,其中 i 来自 [1..L],以及一个测试集向量 x,那么 x 的特征向量应该是

0: 1:K(x^test,x1^train), 2:K(x^test,x2^train) ... L:K(x^test,xL^train)

其中 K(u,v) 用于表示以向量 u 和 v 作为参数的核函数的输出。

我在下面包含了一些示例 python 代码。

原始特征向量表示和预计算(线性)内核的结果并不完全相同,但这可能是由于优化算法的差异。

from svmutil import *
import numpy as np

#original example
y, x = svm_read_problem('.../heart_scale')
m = svm_train(y[:200], x[:200], '-c 4')
p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)

##############
#train the SVM using a precomputed linear kernel

#create dense data
max_key=np.max([np.max(v.keys()) for v in x])
arr=np.zeros( (len(x),max_key) )

for row,vec in enumerate(x):
    for k,v in vec.iteritems():
        arr[row][k-1]=v
x=arr

#create a linear kernel matrix with the training data
K_train=np.zeros( (200,201) )
K_train[:,1:]=np.dot(x[:200],x[:200].T)
K_train[:,:1]=np.arange(200)[:,np.newaxis]+1

m = svm_train(y[:200], [list(row) for row in K_train], '-c 4 -t 4')

#create a linear kernel matrix for the test data
K_test=np.zeros( (len(x)-200,201) )
K_test[:,1:]=np.dot(x[200:],x[:200].T)
K_test[:,:1]=np.arange(len(x)-200)[:,np.newaxis]+1

p_label, p_acc, p_val = svm_predict(y[200:],[list(row) for row in K_test], m)

【讨论】:

以上是关于Libsvm 预计算内核的主要内容,如果未能解决你的问题,请参考以下文章

带有预计算内核的 libsvm:如何计算分类分数?

为啥在 matlab 中使用带有 libsvm 的预计算内核

libsvm 交叉验证与 matlab 中的预计算内核

将置换后的数据放入 LibSVM 预计算内核

Libsvm 和 Python:预计算内核使用我的点 id 作为正常功能?

将预计算的 chi2 内核与 libsvm (matlab) 一起使用时结果不佳