まず、カーネルと 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 のようです。