tutorial paper datasets machine-learning libsvm

machine learning - paper - Núcleos precalculados de Libsvm



libsvm weka (1)

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.

Aquí están las líneas pertinentes del léame de libsvm:

Nueva instancia de entrenamiento para xi:
<etiqueta> 0: i 1: K (xi, x1) ... L: K (xi, xL)

Nueva instancia de prueba para cualquier x:
<etiqueta> 0 :? 1: K (x, x1) ... L: K (x, xL)

El léame de libsvm dice que si tiene L vectores de conjuntos de entrenamiento, donde xi es un vector de conjunto de entrenamiento con i de [1..L], y un vector de conjunto de pruebas, x, entonces el vector de características para x debe ser

<etiqueta de x> 0: <cualquier número> 1: K (x ^ {test}, x1 ^ {train}), 2: K (x ^ {test}, x2 ^ {train}) ... L: K (x ^ {test}, xL ^ {train})

donde K (u, v) se utiliza 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 los mismos, 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)

Estoy usando libsvm con núcleos precalculados. Genere un archivo kernel precalculado para el conjunto de datos de ejemplo heart_scale y ejecute svm-train. Funcionó correctamente y los vectores de soporte se identificaron correctamente, es decir, similar a la versión no precalculada.

Sin embargo, cuando intento ejecutar svm-predict, arroja resultados diferentes para el archivo de modelo precalculado. Después de explorar el código, noté que la función svm_predict_values ​​() requiere las características reales de los vectores de soporte, que no está disponible en el modo precalculado. En el modo precalculado, solo tenemos el coeficiente y el índice de cada vector de soporte, que se confunde con sus características mediante svm-predict.

¿Es esto un error o un problema con mi comprensión? Si es un error de mi parte, hágamelo saber cómo ejecutar svm-predict en modo precalculado.