2016-05-21 28 views
1

matlabを使ったことは一度もありませんでした。このコードはkernalized locality sensitive functionsです。matlabでラジアル基底関数カーネル行列を作成する

私は、次のコードは、RBF kernel functionのkernalizedマトリックスを作成しようとしていることを考える:

%demo script for KLSH 
X = load('iris.mtx'); 
... 
[n,d] = size(X); 

%form RBF over the data: 
nms = sum(X'.^2); 
K = exp(-nms'*ones(1,n) -ones(n,1)*nms + 2*X*X'); 

あなたはdemo.mにコード全体here、特にこのコードを見つけることができます。あなたは私がKが作成された方法を見つけ出す(と説明するのに役立つことができます

enter image description here

今、私はどのようにK(カーネル行列)が計算され、カーネル関数の式の相関関係を見つけることができません私の上のコード)どうか?

+0

のようなブラケット、:http://stackoverflow.com/questions/17690132/what-is-the-algorithm-for-an-rbf-kernel-matrix-in-matlab –

答えて

5

トリック全体は、効率的に行列K_ij = K(x_i、x_j)= f(|| x_i - x_j ||^2)を計算したいという事実に基づいています。行列の計算はドット積に基づいているため、差のノルムではなく乗算が行われます。ループを使用したくない場合(そしてmatlabやRのような言語では使用したくない場合)、行列演算を使ってこの|| x_i - x_j ||^2を表現する方法を理解する必要があります:

||x_i - x_j||^2 = <x_i - x_j, x_i - x_j> 
       = <x_i, x_i> - <x_i, x_j> - <x_j, x_i> + <x_j, x_j> 
       = ||x_i||^2 - 2<x_i, x_j> + ||x_j||^2 

、これは

次の彼らはもののベクトルとの乗算を使用X_I ||^2 = SUM_a x_i_a^2

nms = sum(X'.^2); 

||としてまず彼らは、あなたのデータの二乗を取る実装されている正確に何であります合計操作を計算する

X - jが||の|| X_I ||^2の、及び同様のベクトルのベクトルである
nms'*ones(1,n) 

||^2のは

ones(n,1)*nms 

あり、最終的に彼らは、このように

、私は前に書いた分解を使用して構成します|| X_I - -
-nms'*ones(1,n) -ones(n,1)*nms + 2*X*X') 

はちょうど行列A_ij =は、あなたの場合にはX - jが||^2

、あなたはこのように、直前arugmentを取った後、EXPの下にそれを置く、2sigma^2による除算を持つようにしたいです〜で関連

Ks = exp(-(nms'*ones(1,n) -ones(n,1)*nms + 2*X*X')/(2*sigma^2)); 
+0

ちょうど1(おそらくダム)質問:なぜ|| x_i - x_j ||^2 = ? – justHelloWorld

+0

これはノルムの定義(可能なものの1つ)です。|| a ||^2 = SUM_i a_i^2 = SUM_i a_i * a_i = lejlot

+0

この解決策の奇妙なことは、/(2 *シグマ^ 2))...シグマ= 1を使用しても、まだ存在しない/ 2です。まあ、とにかく優れた答え、おかげで:D – justHelloWorld

関連する問題