2013-06-12 3 views
6

私は緯度と経度を持っているので、RBFカーネルをexp(-1/2 || sophere distrance ||^2)に再定義する必要があります。これは自分自身でカーネル関数を書き直す必要があることを意味します。 次のように私は私のカーネルを書く:私は機能をテストしkernlabパッケージのksvmでカーネル機能をカスタマイズするには?

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" 

、カーネルは正しいはずです。しかし、次のトレーニングのコマンドを使用して、私はエラーを取得しています:

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. 

よりtrickly事があり、私はksvmドキュメント内のサンプル・コードを試みた:

k <- function(x,y) {(sum(x*y) +1)*exp(-0.001*sum((x-y)^2))} 
class(k) <- "kernel" 

をしかし、私は同じエラーを取得しています。

カーネル関数を正しく定義する方法は誰でも知っていますか?

+0

これは本当に役に立ちます。カーネル関数の導出方法を説明できますか?私はexp(-1/2 || sphere distnace ||^2)と 'res 'をどのように完成させるかの関係は見ません。 – momeara

+0

@momeara、私はそれが基本的に三角関数に基づいていると思うので、arctan、arcsin、またはatan2のようなものを使ってそれを行うには複数の方法があります。このリンクをチェックしてください:http://www.movable-type.co.uk/scripts/latlong.html –

+0

この例は私のために働いています。 –

答えて

6

私の問題は次のように解決されます: カーネルコードが正しいです、私は直接関数(x、y)を定義し、クラスを "カーネル"として宣言する必要があります。問題は、ksvmがx、yスタイルをサポートしているdocであっても、実際には動作しません。式データスタイルにそれを変更すると、最後に実行されているものを得ることができます。

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

また、私はまた、ソースrbfdotのコード、およびkernlab自体に定義されている他のカーネルをお読みください。そのコードのスタイルは、このようなものです注意してください:

function(params){ 
    val <- function(x,y){ 
    # True kernel defined here 
    } 
    return (new ("kernel_name",.Data=val,kpar=list(params))) 
} 

しかし、真剣に、私が試した、このスタイルでカーネル関数を作成することはできません。作業方法は直接このスタイルに似ています:

k <- function(x,y){ 
    #calculate the result 
} 
class(k) <- "kernel" 
関連する問題