7

最初に、私はmatlab(およびこのサイト...)に不慣れであると言わなければならないので、私の無知を許してください。

スペクトルクラスタリングを使用してポイントのセットを2つのクラスターに分割する関数をMATLABで作成しようとしています。

私のコードは次のとおりです

function Groups = TrySpectralClustering(data)
dist_mat = squareform(pdist(data));

W=  zeros(length(data),length(data));

for i=1:length(data),
    for j=(i+1):length(data),
    W(i,j)=10^(-dist_mat(i,j));
    W(j,i)=W(i,j);
    end
end
D = zeros(length(data),length(data));
for i=1:length(W),
D(i,i)=sum(W(i,:));
end
L=D-W;
L=D^(-0.5)*L*D^(-0.5);
[ V E ] = eig(L);
disp ('V:');
disp (V);

正しく理解していれば、2番目に小さい固有ベクトルを使用して、データを2つのクラスターに分割できるはずです-2番目の固有ベクトルのi番目のメンバーが正の場合、i番目のデータポイントは1つのクラスターにあります。他のクラスターにあります。

しかし、私が次のことを試してみると

f=[1,1;0,0;1,0;0,1;100,100;100,101;101,101;101,100]
TrySpectralClustering(f)

最初の4つのポイントが1つのクラスターを形成し、最後の4つのポイントが別のクラスターを形成すると予想されます。

しかし、私は受け取ります

V:
   -0.0000   -0.5000    0.0000   -0.5777    0.0000    0.4078   -0.0000    0.5000
   -0.0000   -0.5000    0.0000    0.5777    0.0000   -0.4078   -0.0000    0.5000
   -0.0000   -0.5000    0.0000    0.4078    0.0000    0.5777   -0.0000   -0.5000
   -0.0000   -0.5000    0.0000   -0.4078    0.0000   -0.5777   -0.0000   -0.5000
   -0.5000   -0.0000   -0.0000   -0.0000   -0.7071   -0.0000    0.5000   -0.0000
   -0.5000   -0.0000    0.7071    0.0000   -0.0000   -0.0000   -0.5000   -0.0000
   -0.5000    0.0000   -0.0000    0.0000    0.7071    0.0000    0.5000    0.0000
   -0.5000         0   -0.7071         0         0         0   -0.5000         0

2番目の固有ベクトルを取る

  -0.0000   -0.5000    0.0000    0.5777    0.0000   -0.4078   -0.0000    0.5000

1つのクラスターにはポイント1,0;0,1;100,100; 101,100が含まれ、もう1つのクラスターはポイント1,1; 0,0;100,101;101,101から作成されていることがわかりました。

私は何が間違っているのだろうか。

注:私は宿題プロジェクトの一環として上記に取り組んでいます。

前もって感謝します!

4

3 に答える 3

4

あなたが得ているものは正しいです。Uを上記のように固有ベクトルを含む行列とし、1番目の列が最小の固有値に対応し、プログレッシブ列が昇順の固有値に対応するように配置します。次に、小さい固有値に対応する固有ベクトルを保持することにより、Uの列のサブセットを取得します。次に、これらの列を行ごとに新しいベクトルのセットに読み込み、Yと呼びます。クラスターYを使用して、スペクトルクラスターを取得します。したがって、サブセットが最初の列にすぎないと仮定します。uが最初の列をクラスター化する場合、最初の4つを1つのクラスターに、次の4つを別のクラスターに入れることがはっきりとわかります。これはあなたが望むものです。

于 2013-03-19T09:10:20.473 に答える
3

J.Shi教授のウェブページで実装を見てください。機能に細心の注意を払ってdiscretisation.mください。

さらに、コードは非常に非効率的です。Matlabのベクトル化をさらに活用する必要があります。

W = 10.^( - dist_mat ); % single liner of nested loop for comuting W
% computing the symmetric laplacian
d = sum( W, 2 ); % sum each row
d( d == 0 ) = 1; % avoid division by zero
d_half = 1./sqrt( d );
L = eye( n ) - bsxfun( @times, bsxfun( @times, W, d_half' ),  d_half );
于 2013-03-19T09:48:56.373 に答える
2

2つの観察:

  1. L=D-W; L=D^(-0.5)*L*D^(-0.5); なぜ彼に単位行列を計算させるのですか?単位行列eye(n)を使用し、そこからD ^(-0.5)* W * D ^(-0.5)を差し引くだけで、ラプラシアンLが計算されます。

  2. eigは固有ベクトルを列として返しますが、なぜ行を取るのですか?Eの対応する固有値の値を確認したので、2番目に小さい固有値に対応する固有値を見ていることを確認できますか?

于 2013-03-19T08:47:14.797 に答える