Ich habe Breiten- und Längengrade, also muss ich den RBF-Kernel in exp (-1/2 || sophere distrance ||^2) umdefinieren, was bedeutet, dass ich selbst eine Kernel-Funktion schreiben muss. Ich schreibe meine Kernel wie folgt:Wie Sie eine Kernel-Funktion in ksvm des Kernlab-Pakets anpassen?
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"
ich die Funktion getestet, sollte der Kernel korrekt sein. Aber mit dem folgende Training Befehl ich die Störung erhalte:
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.
Je mehr Trickly Sache ist, habe ich versucht, den Beispielcode in ksvm Dokument:
k <- function(x,y) {(sum(x*y) +1)*exp(-0.001*sum((x-y)^2))}
class(k) <- "kernel"
Aber ich bin mit dem gleichen Fehler.
Wer weiß, wie man eine Kernfunktion richtig definiert?
Das ist wirklich hilfreich. Können Sie erklären, wie Sie die Kernel-Funktion abgeleitet haben? Ich sehe nicht die Verbindung zwischen exp (-1/2 || sphere distnace ||^2) und wie Sie 'res' abschließen. – momeara
@momeara, ich denke, es basiert im Wesentlichen auf Dreiecksfunktionen, also kann es mehrere Wege geben, es mit arctan, arcsin oder hier wie atan2 zu machen. Überprüfen Sie diesen Link: http://www.movable-type.co.uk/scripts/latlong.html –
Das Beispiel funktioniert für mich. –