0

何時間も試しましたが、解決策が見つかりません。

「2 つのドーナツ」データ サンプル (変数「X」) があります。

リンクの下のファイルをダウンロードできます

ドーナツ データセット(rings.mat)

下の画像のように2D形状に広がります

最初の 250 ポイントはドーナツの内側にあり、最後の 750 ポイントはドーナツの外側にあります。

2 ドーナツ 2D サンプル

スペクトル クラスタリングを実行する必要があります。

(類似行列「W」)をガウス類似度距離で作りました。

そして、「W」の各生の合計で次数行列を作成しました

そして、固有値(E)と固有ベクトル(V)を計算しました

「V」の形が良くありません。

私の試用版の何が問題になっていますか???

わかりません。

load rings.mat
[D, N] = size(X); % data stored in X
%initial plot data
figure; hold on; 
for i=1:N,
    plot(X(1,i), X(2,i),'o');
end
% perform spectral clustering
W = zeros(N,N); 
D = zeros(N,N);

sigma = 1;
for i=1:N,
    for j=1:N,
        xixj2 = (X(1,i)-X(1,j))^2 + (X(2,i)-X(2,j))^2 ;
        W(i,j) =  exp(  -1*xixj2 / (2*sigma^2) ) ;   % compute weight here
%          if (i==j)
%              W(i,j)=0;
%          end;
    end;
     D(i,i) = sum(W(i,:))    ;
end;

L = D - W ;
normL = D^-0.5*L*D^-0.5;
[u,s,v] = svd(normL);

画像

4

1 に答える 1

1

コード内のようにラプラシアン (「実際の」ラプラシアン) を使用する場合、ポイントを 2 つのセットにクラスター化するには、2 番目に小さい固有値に対応する固有ベクトルが必要になります。

直感的なアイデアは、すべてのポイントをスプリングで相互に接続することです。ポイントが互いに近くにある場合、スプリングは硬くなり、ポイントが離れている場合は硬くなりません。ラプラシアンの固有ベクトルは、スプリング ネットワークをハンマーで叩いて振動する様子を観察した場合の振動モードです。固有値が小さいほど、周波数が低い「バルク」モードに対応し、固有値が大きいほど、周波数が高い振動に対応します。2 番目に小さい固有値に対応する固有値が必要です。これは、ドラムの 2 番目のモードのようになり、正の部分がクラスター化され、負の部分がクラスター化されます。

現在、最大の固有値を使用するか最小の固有値を使用するかについて、コメントに多少の混乱があります。これは、dave によってリンクされた論文のラプラシアンがわずかに異なり、アイデンティティからラプラシアンを引いたものであるためです。つまり、彼らは最大のものを望んでいますが、あなたは最小のものを望んでいます。この論文のクラスタリングももう少し高度で優れていますが、実装はそれほど簡単ではありません。

動作するように変更されたコードは次のとおりです。

load rings.mat
[D, N] = size(X); % data stored in X
%initial plot data
figure; hold on; 
for i=1:N,
    plot(X(1,i), X(2,i),'o');
end
% perform spectral clustering
W = zeros(N,N); 
D = zeros(N,N);

sigma = 0.3; % <--- Changed to be smaller
for i=1:N,
    for j=1:N,
        xixj2 = (X(1,i)-X(1,j))^2 + (X(2,i)-X(2,j))^2 ;
        W(i,j) =  exp(  -1*xixj2 / (2*sigma^2) ) ;   % compute weight here
%          if (i==j)
%              W(i,j)=0;
%          end;
end;
     D(i,i) = sum(W(i,:))    ;
end;

L = D - W ;
normL = D^-0.5*L*D^-0.5;
[u,s,v] = svd(normL);

% New code below this point
cluster1 = find(u(:,end-1) >= 0);
cluster2 = find(u(:,end-1) < 0);

figure
plot(X(1,cluster1),X(2,cluster1),'.b')
hold on
plot(X(1,cluster2),X(2,cluster2),'.r')
hold off
title(sprintf('sigma=%d',sigma))

結果は次のとおりです。

ここに画像の説明を入力

ここで、sigma を 1.0 から 0.3 に小さく変更したことに注意してください。1.0のままにすると、次の結果が得られました。

ここに画像の説明を入力

これは、sigma=1 の場合、内側のクラスターのポイントが外側のクラスター (約 1 の距離にある) を十分に「引っ張る」ことができたため、両方の円を半分に分割する方がエネルギー的に有利であったためだと思います。 2 つの異なる円ではなく、しっかりとした振動ドラムのように。

于 2015-11-20T09:43:41.237 に答える