Los valores de la evaluación del núcleo entre un vector de conjunto de prueba, x, y cada vector de conjunto de entrenamiento se deben usar como el vector de características del conjunto de prueba.
Estas son las líneas pertinentes desde el readme libsvm:
nueva instancia de formación para xi:
< label> 0: i 1: K (x, x1) ... L: K (xi , xL)
Nueva instancia de prueba para cualquier x:
< label> 0 :? 1: K (x, x1) ... L: K (x, XL)
El readme libsvm está diciendo que si usted tiene L vectores del conjunto de entrenamiento, donde xi es un vector conjunto de entrenamiento con i de [ 1..L], y un vector de conjunto de prueba, x, entonces el vector de característica para x debe ser
< etiqueta de x> 0: < cualquier número> 1: K (x^{test}, x1^{ tren}), 2: K (x^{test}, x2^{train}) ... L: K (x^{test}, xL^{train})
donde K (u, v) se usa para denotar la salida de la función kernel con los vectores u y v como argumentos.
He incluido algunos ejemplos de código python a continuación.
Los resultados de la representación del vector de características original y del núcleo precalculado (lineal) no son exactamente iguales, pero esto probablemente se deba a diferencias en el algoritmo de optimización.
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)
Por lo que recuerdo, debe predecir manualmente los valores si utiliza un kernel precalculado para entrenar el SVM. – George