Se pensi a come la macchina vettoriale di supporto potrebbe "usare" la matrice del kernel, vedrai che non puoi farlo nel modo in cui stai provando (come hai visto :-)
In realtà ho faticato un po 'con questo quando ho usato kernlab + una matrice del kernel ... per coincidenza, era anche per i kernel di grafici!
In ogni caso, rendiamo conto che dal momento che SVM non sa come calcolare la funzione del kernel, è necessario che questi valori siano già stati calcolati tra i nuovi esempi (di prova) e gli esempi selezionati come vettori di supporto durante la fase di addestramento.
Quindi, è necessario calcolare la matrice di kernel per tutte dei tuoi esempi insieme. In seguito ti allenerai su alcuni e testerai gli altri rimuovendo righe + colonne dalla matrice del kernel quando appropriato. Lascia che ti mostri con il codice.
Possiamo utilizzare il codice di esempio nella documentazione ksvm
per caricare il nostro spazio di lavoro con alcuni dati:
library(kernlab)
example(ksvm)
avrete bisogno di colpire tornare un paio di (2) volte al fine di lasciare le trame disegnare, e lascia che l'esempio finisca, ma ora dovresti avere una matrice del kernel nel tuo spazio di lavoro chiamato K
. Abbiamo bisogno di recuperare il vettore y
che dovrebbe utilizzare per le sue etichette (come è stato calpestato da altro codice nell'esempio):
y <- matrix(c(rep(1,60),rep(-1,60)))
Ora, selezionare un sottoinsieme di esempi da utilizzare per i test
holdout <- sample(1:ncol(K), 10)
da questo punto in poi, ho intenzione di:
- Creare una matrice di kernel di formazione chiamato
trainK
dalla matrice originale K
kernel.
- Creare un modello SVM dalla mia formazione impostata
trainK
- Utilizzare i vettori di supporto trovati dal modello per creare una matrice di kernel test
testK
... questa è la parte strana. Se osservi il codice in kernlab
per vedere come utilizza gli indici vettoriali di supporto, vedrai perché viene eseguito in questo modo. Potrebbe essere possibile farlo in un altro modo, ma non ho visto alcuna documentazione/esempi su che prevedano con una matrice del kernel, quindi lo sto facendo "nel modo più duro" qui.
- Utilizzare la SVM di prevedere su queste caratteristiche e segnalare la precisione
Ecco il codice:
trainK <- as.kernelMatrix(K[-holdout,-holdout]) # 1
m <- ksvm(trainK, y[-holdout], kernel='matrix') # 2
testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F]) # 3
preds <- predict(m, testK) # 4
sum(sign(preds) == sign(y[holdout]))/length(holdout) # == 1 (perfect!)
Questo dovrebbe solo di farlo. In bocca al lupo!
risposte a commentare qui sotto
cosa K [-holdout, -holdout] significa? (cosa significa "-" significa?)
Immaginate di avere un vettore x
, e si desidera recuperare gli elementi 1, 3 e 5 da esso, faresti:
x.sub <- x[c(1,3,5)]
Se si desidera recuperare tutto da x
tranne elementi 1, 3, e 5, faresti:
x.sub <- x[-c(1,3,5)]
Così K[-holdout,-holdout]
riporta tutte le righe e colonne di K
eccetto per le righe che vogliamo escludere.
Quali sono gli argomenti del tuo as.kernelMatrix - (? Che è particolarmente strano perché sembra che tutta la staffa è un indice di matrice K) in particolare la [, SVindex (m), rilasciare = F] argomento
Sì, ho inline due comandi in una sola:
testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F])
Ora che hai addestrato il modello, si vuole dare una nuova matrice kernel con i tuoi esempi di test. K[holdout,]
fornirebbe solo le righe che corrispondono agli esempi di addestramento in K
e tutte le colonne di K
.
SVindex(m)
ti dà gli indici delle tue vettori di supporto dal matrice formazione originale - ricorda, le righe/cols sono holdout
rimossi. Pertanto, affinché gli indici delle colonne siano corretti (ad es. Si faccia riferimento alla colonna sv corretta), devo prima rimuovere le colonne holdout
.
In ogni caso, forse questo è più chiaro:
testK <- K[holdout, -holdout]
testK <- testK[,SVindex(m), drop=FALSE]
Ora testK
ha solo le righe dei nostri esempi di test e le colonne che corrispondono ai vettori di supporto. testK[1,1]
avrà il valore della funzione del kernel calcolata tra il primo esempio di test e il primo vettore di supporto. testK[1,2]
avrà il valore della funzione del kernel tra il 1 ° esempio di prova e il secondo vettore di supporto, ecc
Aggiornamento (2014/01/30) per rispondere commento da @wrahool
E 'stato un po' che ho 've giocato con questo, quindi i particolari di kernlab::ksvm
sono un po' arrugginito, ma in linea di principio dovrebbe essere corretto :-) ... ecco qui:
qual è il punto di testK <- K[holdout, -holdout]
- non si sono rimozione le colonne che corrispondono al set di test?
Sì. La risposta breve è che se si desidera utilizzare predict
utilizzando una matrice del kernel, è necessario fornire una matrice della dimensione rows
entro il support vectors
. Per ogni riga della matrice (il nuovo esempio che si desidera predire su) i valori nelle colonne sono semplicemente il valore della matrice del kernel valutata tra quell'esempio e il vettore di supporto.
La chiamata a SVindex(m)
restituisce l'indice dei vettori di supporto indicati nella dimensione dei dati di allenamento originali.
Quindi, per prima cosa, mi fornisce una matrice testK
con le righe degli esempi che voglio prevedere, e le colonne provengono dagli stessi esempi (dimensione) su cui il modello è stato addestrato.
Ho ulteriormente suddiviso le colonne di testK
per SVindex(m)
solo per darmi le colonne che (ora) corrispondono ai miei vettori di supporto. Se non avessi effettuato la prima selezione [, -holdout]
, gli indici restituiti da SVindex(m)
potrebbero non corrispondere agli esempi corretti (a meno che tutti gli N
colonne della matrice non siano tutti gli N
colonne della matrice).
Inoltre, cosa fa esattamente la caduta = condizione FALSE?
È un po 'di codifica difensiva per garantire che dopo l'esecuzione dell'operazione di indicizzazione, l'oggetto restituito sia dello stesso tipo dell'oggetto che è stato indicizzato.
In R, se si indice solo una dimensione di un oggetto 2D (o superiore (?)), Viene restituito un oggetto della dimensione inferiore. Non voglio passare un vettore numeric
in predict
perché vuole avere un matrix
Per esempio
x <- matrix(rnorm(50), nrow=10)
class(x)
[1] "matrix"
dim(x)
[1] 10 5
y <- x[, 1]
class(y)
[1] "numeric"
dim(y)
NULL
Lo stesso accadrà con data.frame
s, ecc
Ok, quindi ho eseguito il codice come scritto, e funziona! Ma ho un po 'di problemi a capire cosa fa. Potresti aiutarmi a capire: cosa significa K [-noldout, -holdout]? (cosa significa "-"?) Quali sono gli argomenti del tuo as.kernelMatrix - in particolare l'argomento [, SVindex (m), drop = F] (che è particolarmente strano perché sembra che l'intera parentesi sia un indice di matrice di K?) – poundifdef
Dato che era lungo, ho risposto al tuo commento nel mio post originale - leggi la metà inferiore. Se hai altre domande, puoi sempre venire nella lista di aiuto per chiedere più domande. Infine, se la mia risposta risponde alla tua domanda, non dimenticare di contrassegnarla come tale ;-) –
Amico. Ti piace tanto. Grazie! – poundifdef