7

緯度と経度があるので、RBF カーネルを exp(-1/2||sophhere distrance||^2) に再定義する必要があります。つまり、カーネル関数を自分で書き直す必要があります。カーネルを次のように記述します。

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.

さらにトリッキーなのは、ksvm ドキュメントのサンプル コードを試したことです。

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

しかし、私は同じエラーが発生しています。

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

4

1 に答える 1

7

私の問題は次のように解決されます。カーネルコードは正しいです。関数(x、y)を直接定義し、そのクラスを「kernel」として宣言する必要があります。問題は、ksvm が x、y スタイルをサポートしているドキュメントにもありますが、実際には機能しません。これをフォーミュラ データ スタイルに変更すると、最終的に動作するようになります。

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"
于 2013-06-12T22:17:57.617 に答える