Prima di tutto, alcuni retroscena di kernel e SVM ...
Se si vuole pre-calcolare un kernel per n
vettori (di qualsiasi dimensione), che cosa dobbiamo fare è calcolare la funzione del kernel tra ogni coppia di esempi. La funzione kernel prende due vettori e dà uno scalare, quindi puoi pensare a un kernel precompilato come una matrice di scalari nxn
. Di solito è chiamato la matrice del kernel, o talvolta la matrice Gram.
Ci sono molti kernel differenti, il più semplice è il kernel lineare (noto anche come il prodotto scalare):
sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors
In secondo luogo, cercando di rispondere il tuo problema ...
La documentazione sui kernel precompilati in libsvm è in realtà piuttosto buona ...
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
Ogni vettore qui nel secondo esempio è una riga nella matrice del kernel. Il valore a zero indice è il valore ID e sembra essere solo un conteggio sequenziale. Il valore all'indice 1 del primo vettore è il valore della funzione kernel del primo vettore dal primo esempio con se stesso (ovvero (1x1)+(1x1)+(1x1)+(1x1) = 4
), il secondo è il valore della funzione kernel del primo vettore con il secondo (ovvero (1x3)+(1x3)=6
). Segue così per il resto dell'esempio. Potete vedere che la matrice del kernel è simmetrica, come dovrebbe essere, perché K (x, y) = K (y, x).
Vale la pena sottolineare che il primo set di vettori è rappresentato in un formato sparse (cioè i valori mancanti sono zero), ma la matrice del kernel non è e non dovrebbe essere sparsa. Non so perché sia, sembra solo una cosa di libsvm.
Risposta più utile! – JXITC