4

SVM を使用したトレーニング用に修正されたカーネル マトリックスを生成する新しいアルゴリズムを開発していたところ、奇妙な問題が発生しました。

テスト目的で、kernelMatrix インターフェイスと通常のカーネル インターフェイスを使用して学習した SVM モデルを比較しました。例えば、

# Model with kernelMatrix computation within ksvm
svp1 <- ksvm(x, y, type="C-svc", kernel=vanilladot(), scaled=F)
# Model with kernelMatrix computed outside ksvm
K <- kernelMatrix(vanilladot(), x)
svp2 <- ksvm(K, y, type="C-svc")
identical(nSV(svp1), nSV(svp2))

カーネルマトリックスでスケーリングを実行する方法がわからないため、スケーリングをオフにしたことに注意してください。

私の理解では、両方ともsvp1同じsvp2モデルを返す必要があります。glass0ただし、これはKEELなどのいくつかのデータセットには当てはまらないことがわかりました。

ここで何が欠けていますか?

4

1 に答える 1

4

これは、ここに投稿された同じ問題に関係していると思います。kernlab は、vanilladot() のクラスが「kernel」ではなく「vanillakernel」であるため、明示的に vanilladot() を使用すると、ksvm の計算を異なる方法で処理するようです。

「vanillakernel」ではなく「kernel」のクラスで独自のvanilladotカーネルを定義すると、コードは両方で同等になります。

kfunction.k <- function(){
   k <- function (x,y){crossprod(x,y)}
   class(k) <- "kernel"
   k}
l<-0.1 ; C<-1/(2*l)

svp1 <- ksvm(x, y, type="C-svc", kernel=kfunction.k(), scaled=F)

K <- kernelMatrix(kfunction.k(),x)

svp2 <- ksvm(K, y, type="C-svc", kernel='matrix', scaled=F)

identical(nSV(svp1), nSV(svp2))

この変更により、svp1 と svp2 の両方が元のコードの値と異なることに注意してください。

于 2015-09-26T23:48:25.883 に答える