Libsvm预计算核函数

11

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

然而,当我尝试运行svmpredict()时,对于预先计算的模型文件,结果却不同。经过查看代码,我发现svm_predict_values()函数需要支持向量实际的特征,但在预先计算的模式下这是不可用的。在预先计算的模式下,我们只有每个支持向量的系数和索引,而这些被 svmpredict() 错误地视为其特征。

这是一个问题还是我漏掉了什么?

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


2
据我所记,如果您使用预先计算的内核来训练SVM,则必须手动预测值。 - George
1个回答

5
将测试集向量x与每个训练集向量之间的核评估值用作测试集特征向量。
以下是libsvm自述文件中的相关行:
新的xi训练实例:
<label> 0:i 1:K(xi,x1) ... L:K(xi,xL)
任何x的新测试实例:
<label> 0:? 1:K(x,x1) ... L:K(x,xL) libsvm自述文件表示,如果您有L个训练集向量,其中xi是具有i从[1..L]的训练集向量,并且有一个测试集向量x,则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)

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