测试集向量 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)