En primer lugar, algunos antecedentes de los granos y las MSV ...
Si desea pre-calcular un núcleo para n
vectores (de cualquier dimensión), lo que hay que hacer es calcular la función del núcleo entre cada par de ejemplos. La función kernel toma dos vectores y da un escalar, por lo que puede pensar en un kernel precalculado como una matriz de escalares nxn
. Por lo general, se lo denomina matriz del kernel o, a veces, matriz de Gram.
Hay muchos núcleos diferentes, el más simple es el núcleo lineal (también conocido como el producto escalar):
sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors
En segundo lugar, tratando de responder a su problema ...
La documentación sobre núcleos precalculados en libsvm es bastante buena ...
Assume the original training data has three four-feature instances
and testing data has one instance:
15 1:1 2:1 3:1 4:1
45 2:3 4:3
25 3:1
15 1:1 3:1
If the linear kernel is used, we have the following
new training/testing sets:
15 0:1 1:4 2:6 3:1
45 0:2 1:6 2:18 3:0
25 0:3 1:1 2:0 3:1
15 0:? 1:2 2:0 3:1
Cada vector aquí en el segundo ejemplo es una fila en la matriz del kernel. El valor en el índice cero es el valor de ID y simplemente parece ser un conteo secuencial. El valor en el índice 1 del primer vector es el valor de la función kernel del primer vector del primer ejemplo consigo mismo (es decir, (1x1)+(1x1)+(1x1)+(1x1) = 4
), el segundo es el valor de la función kernel del primer vector con el segundo (es decir, (1x3)+(1x3)=6
) Sigue así por el resto del ejemplo. Puede ver que la matriz del kernel es simétrica, como debería ser, porque K (x, y) = K (y, x).
Vale la pena señalar que el primer conjunto de vectores se representa en un formato disperso (es decir, los valores faltantes son cero), pero la matriz del kernel no es ni debe ser escasa. No sé por qué es así, parece ser una cosa de libsvm.
¡La respuesta más útil! – JXITC