2013-06-12 15 views
6

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?

+0

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

+0

@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 –

+0

Das Beispiel funktioniert für mich. –

Antwort

6

Mein Problem ist wie folgt gelöst: die Kernel-Codes sind korrekt, ich sollte direkt eine Funktion (x, y) definieren und ihre Klasse als "Kernel" deklarieren. Das Problem ist sogar in der doc die ksvm unterstützt x, y Stile, sie funktionieren tatsächlich nicht. Ändern es zu Formel-Daten Stil kann schließlich werden die Dinge laufen:

fit <- ksvm(Freq~lat+lon,data=train[,2:4],kernel=roundrbf,type='eps-svr') 

Außerdem lese ich auch den Quellcode von rbfdot und andere in der kernlab selbst definiert Kerne. Beachten Sie, dass ihr Codestil wie folgt lautet:

Aber im Ernst, ich habe es versucht, und die Kernfunktionen in diesem Stil funktionieren wird nicht funktionieren. Der Arbeitsweg ist wie dieser Stil direkt:

k <- function(x,y){ 
    #calculate the result 
} 
class(k) <- "kernel"