5

ユーザー定義のカーネルを使用しようとしています。kernlab が R でユーザー定義のカーネル (カスタム カーネル関数) を提供していることは知っています。パッケージ kernlab を含むデータ スパムを使用しました。(変数の数=57 例の数=4061)

私はカーネルのフォームを定義しています。

kp=function(d,e){

as=v*d
bs=v*e
cs=as-bs
cs=as.matrix(cs)

exp(-(norm(cs,"F")^2)/2)
}

class(kp)="kernel"

これは、ガウス カーネル用に変換されたカーネルです。ここで、vは各変数に関する標準偏差ベクトルの逆数である連続的に変化する値です。たとえば、次のようになります。

v=(0.1666667,........0.1666667)

トレーニング セットは、スパム データの 60% を定義しました (異なるクラスの割合を維持します)。

データのタイプがスパムの場合、train svm のデータのタイプ = 1 より

m=ksvm(xtrain,ytrain,type="C-svc",kernel=kp,C=10)

しかし、このステップはうまくいきません。常に応答を待っています。

では、この問題についてお尋ねします。なぜですか?例の数が多すぎるからですか?ユーザー定義カーネル用に SVM をトレーニングできる他の R パッケージはありますか?

4

1 に答える 1

3

まず、あなたのカーネルは古典的な RBF カーネルのように見えますが、v = 1/sigmaなぜそれを使用するのでしょうか? 組み込みの RBF カーネルを使用して、sigmaパラメーターを設定するだけです。特に、行列でフロベニウス ノルムを使用する代わりに、ベクトル化された行列で古典的なユークリッドを使用できます。

2番目 - これは問題なく動作しています。

> xtrain = as.matrix( c(1,2,3,4) )
> ytrain = as.factor( c(0,0,1,1) )
> v= 0.01
> m=ksvm(xtrain,ytrain,type="C-svc",kernel=kp,C=10)
> m
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
 parameter : cost C = 10 


Number of Support Vectors : 4 

Objective Function Value : -39.952 
Training error : 0 

結果を待っている理由は少なくとも 2 つあります。

  • RBF カーネルは、SVM を最適化するための最も困難な問題を引き起こします (特に大規模なC) 。
  • ユーザー定義のカーネルはビルトインよりはるかに効率が悪い

ksvmユーザー定義のカーネル計算を実際に最適化するかどうかはわかりませんが (実際には最適化しないと確信しています)、カーネル マトリックス ( はトレーニング ベクトル) を作成K[i,j] = K(x_i,x_j)して提供することx_iができます。あなたはこれを達成することができますi'thksvm

K <- kernelMatrix(kp,xtrain)
m <- ksvm(K,ytrain,type="C-svc",kernel='matrix',C=10)

カーネル行列の事前計算は非常に長いプロセスになる可能性がありますが、最適化自体ははるかに高速になるため、多くの異なるC値をテストする場合に適した方法です (必ず実行する必要があります)。残念ながら、これにはO(n^2)メモリが必要なので、100,000 を超えるベクターを使用する場合は、非常に大量の RAM が必要になります。

于 2013-09-01T05:10:21.293 に答える