2

私は次の機能を使用しています:

kernel = @(X,Y,sigma) exp((-pdist2(X,Y,'euclidean').^2)./(2*sigma^2));

次の方法で、一連のカーネルを計算します。

K = [(1:size(featureVectors,1))', kernel(featureVectors,featureVectors, sigma)];

ただし、featureVectorsは巨大な行列 (10000x10000 など) であるため、カーネルの計算に非常に長い時間がかかります (例: K)。

どういうわけか計算を高速化することは可能ですか?


編集:コンテキスト

libsvm変数名とセマンティクスからお気づきかもしれませんが、ガウス カーネルを使用して を介して分類子を使用しています。

私は今(多かれ少なかれ)#terms~=10000#docs~=10000. この #terms は、ストップワードの削除とステミングの結果です。このコースは、10000機能を持つことが理にかなっていることを示しています。

残念ながら、libsvmGaussian カーネルは自動的に実装されません。したがって、手で計算する必要があります。私はここからアイデアを取り入れましたが、カーネルの計算 (参照された質問で示唆されているように) は本当に遅いです。

4

2 に答える 2

1

pdist22 つの等しい入力引数を使用しています (XYを呼び出すと等しいkernel)。各ペアを 1 回だけ計算することで、半分の時間を節約できます。あなたはそれを使用してpdistそれを行いsquareformます:

kernel = @(X,sigma) exp((-squareform(pdist(X,'euclidean')).^2)./(2*sigma^2));
K = [(1:size(featureVectors,1))', kernel(featureVectors, sigma)];
于 2014-05-28T13:47:17.533 に答える
0

指数関数は非常に速く低下します。距離が数の場合sigma、カーネル関数は基本的にゼロになります。これらのケースを整理して、より速くすることができます。

function z = kernel(X, Y, sigma)
  d = pdist2(X,Y,'euclidean');
  z = zeros(size(d)); % start with zeros
  m = d < 3 * sigma;
  z(m) = exp(-d(m).^2/(2*sigma^2));
end
于 2014-05-28T11:37:25.900 に答える