Ho latitudini e longitudini, quindi ho bisogno di ridefinire il kernel RBF in exp (-1/2 || sophere distrance ||^2), il che significa che ho bisogno di riscrivere una funzione del kernel da solo. scrivo il mio kernel come segue:Come personalizzare una funzione del kernel in ksvm del pacchetto kernlab?
round.kernel <- function(x,y){
sigma <- 1
#R <- 6371
R <- 1
a <- (sin((x[1]-y[1])/2))^2+cos(x[1])*cos(y[1])*(sin((x[2]-y[2])/2))^2
c <- 2*atan2(sqrt(a),sqrt(1-a))
d <- R*c
res <- exp(-d^2/(2*sigma))
return (res)
}
class(round.kernel) <- "kernel"
ho provato la funzione, il kernel dovrebbe essere corretto. Ma con il comando seguente formazione sto ottenendo l'errore:
fit <- ksvm(y=train[,2],x=train[,3:4],kernel=round.kernel,type='eps-svr')
Error in .local(x, ...) :
List interface supports only the stringdot kernel.
La cosa più trickly è, ho provato il codice di esempio nel documento ksvm:
k <- function(x,y) {(sum(x*y) +1)*exp(-0.001*sum((x-y)^2))}
class(k) <- "kernel"
Ma io sono sempre lo stesso errore.
Qualcuno sa come definire correttamente una funzione del kernel?
Questo è veramente utile. Puoi spiegare come hai derivato la funzione del kernel? Non vedo la connessione tra exp (-1/2 || distnace sfera ||^2) e come si completa 'res'. – momeara
@momeara, penso che sia fondamentalmente basato su funzioni triangolari, quindi ci possono essere diversi modi per farlo usando arctan, arcsin, o qui come atan2. Controlla questo link: http://www.movable-type.co.uk/scripts/latlong.html –
L'esempio funziona per me. –