最初に、私は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から作成されていることがわかりました。
私は何が間違っているのだろうか。
注:私は宿題プロジェクトの一環として上記に取り組んでいます。
前もって感謝します!