11

約 3 時間ネットを検索しましたが、まだ解決策を見つけることができませんでした。事前計算済みのカーネルを libsvm に渡してデータセットを分類したいのですが、

  • 事前計算されたカーネルを生成するにはどうすればよいですか? (たとえば、アイリス データの事前計算された基本的なカーネルは何ですか?)

  • libsvm のドキュメントには、次のように記載されています。

    事前計算されたカーネルの場合、各インスタンスの最初の要素は ID でなければなりません。例えば、

            samples = [[1, 0, 0, 0, 0], [2, 0, 1, 0, 1], [3, 0, 0, 1, 1], [4, 0, 1, 1, 2]]
            problem = svm_problem(labels, samples)
            param = svm_parameter(kernel_type=PRECOMPUTED)
    

と言いました?これ以上の詳細はありません。ID を連続して割り当てることはできますか?

libsvm のヘルプと事前計算されたカーネルの例は本当に感謝しています。

4

4 に答える 4

17

まず、カーネルと SVM の背景について説明します...

ベクトル (任意の次元)のカーネルを事前に計算する場合nは、サンプルの各ペア間のカーネル関数を計算する必要があります。カーネル関数は 2 つのベクトルを取り、スカラーを与えるため、事前計算されたカーネルnxnをスカラーの行列と考えることができます。通常、カーネル行列、またはグラム行列と呼ばれることもあります。

多くの異なるカーネルがあり、最も単純なものは線形カーネル (ドット積とも呼ばれます) です。

sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors

第二に、あなたの問題に答えようとしています...

libsvm の事前計算されたカーネルに関するドキュメントは、実際にはかなり優れています...

元のトレーニング データに 4 つの特徴のインスタンスが 3 つあるとします。
テスト データには 1 つのインスタンスがあります。

15 1:1 2:1 3:1 4:1
45 2:3 4:3
25 3:1
15 1:1 3:1

線形カーネルを使用すると、次のようになります。
新しいトレーニング/テスト セット:

15 0:1 1:4 2:6 3:1
45 0:2 1:6 2:18 3:0
25 0:3 1:1 2:0 3:1

15 0:? 1:2 2:0 3:1

2 番目の例の各ベクトルは、カーネル行列の行です。インデックス 0 の値は ID 値であり、連続カウントのように見えます。最初のベクトルのインデックス 1 の値は、それ自体を持つ最初の例の最初のベクトルのカーネル関数の値 (すなわち(1x1)+(1x1)+(1x1)+(1x1) = 4) であり、2 番目は 2 番目のベクトルを持つ最初のベクトルのカーネル関数の値 (すなわち(1x3)+(1x3)=6) です。例の残りの部分についても同様です。K(x,y) = K(y,x) であるため、カーネル行列が対称であることがわかります。

ベクトルの最初のセットはスパース形式 (つまり、欠損値がゼロ) で表されますが、カーネル マトリックスはスパースではなく、スパースであってはなりません。理由はわかりませんが、libsvm のようです。

于 2010-03-19T10:07:27.003 に答える
8

scikit-learnは、カスタムカーネルを処理するときにlibsvmの詳細のほとんどを非表示にします。カーネルとして任意の関数を渡すだけで、グラム行列が計算されるか、事前に計算されたカーネルのグラム行列が渡されます。

最初のものの構文は次のとおりです。

   >>> from scikits.learn import svm
   >>> clf = svm.SVC(kernel=my_kernel)

ここで、my_kernelはカーネル関数です。次に、clf.fit(X、y)を呼び出すと、カーネル行列が計算されます。2番目の場合、構文は次のとおりです。

   >>> from scikits.learn import svm
   >>> clf = svm.SVC(kernel="precomputed")

また、clf.fit(X、y)を呼び出す場合、Xは行列k(X、X)である必要があります。ここで、kはカーネルです。詳細については、次の例も参照してください。

http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html

于 2010-12-16T08:39:28.163 に答える
4

以下は、正しく機能する単純な 2 つのカテゴリ 3 のベクトル カスタム カーネル入力ファイルです。パーツについて説明します (ただし、StompChicken の回答も参照してください)。

1 0:1 1:10 2:12 3:21
2 0:2 1:12 2:19 3:30
1 0:3 1:21 2:30 3:130

各行の最初の数字は、それが属するカテゴリです。各行の次のエントリは 0:n の形式で、連続している必要があります。つまり
、最初のエントリでは
0:1、2 番目のエントリでは
0:2、3 番目のエントリでは 0:3 です。

これの考えられる理由は、libsvm が出力ファイル内のベクトルに対応する値 alpha_i を返すことですが、事前に計算されたカーネルの場合、ベクトルは表示されず (これは本当に巨大になる可能性があります)、そのベクトルに対応するインデックス 0:n が表示されます。出力を入力と一致させやすくします。特に、出力は入れた順序とは異なるため、カテゴリ別にグループ化されています。したがって、入力ファイルを読み取るときに、libsvm の出力を独自の入力と一致させて、これらの 0:n 値を持つことができると非常に便利です。ここで出力を見ることができます

svm_type c_svc kernel_type
precomputed
nr_class 2
total_sv 3
rho -1.53​​951
label 1 2
nr_sv 2 1
SV
0.4126650675419768 0:1
0.03174528241667363 0:3
-0.4444103499586504 0:2

事前計算されたカーネルでは、他のすべてのカーネルのようにゼロ エントリを省略できないことに注意することが重要です。それらは明示的に含める必要があります。

于 2010-09-13T20:35:40.307 に答える
3

libSVM のscikit-learnの python バインディングが問題に対処するはずだと私は信じています。

詳細については、 http://scikit-learn.sourceforge.net/modules/svm.html#kernel-functionsのドキュメントを参照してください。

于 2010-09-11T14:42:23.703 に答える