Zunächst einmal muss ich sagen, dass ich Matlab neu bin (und zu dieser Seite ...), bitte entschuldigen Sie meine Ignoranz.spektrale Clustering
Ich versuche, eine Funktion in Matlab schreiben, die Spectral Clustering verwendet, um eine Reihe von Punkten in zwei Cluster aufzuteilen.
mein Code als
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);
folgt Wenn ich richtig verstehe, dann durch den zweiten kleinsten Eigenvektor mit soll ich in der Lage, eine Partition der Daten in zwei Cluster ausführen - Wenn das i-te Element der zweiten Eigenvektor ist positiv, der i-te Datenpunkt wäre in dem einen Cluster, andernfalls wäre er in dem anderen Cluster.
aber wenn ich versuche, die folgende
f=[1,1;0,0;1,0;0,1;100,100;100,101;101,101;101,100]
TrySpectralClustering(f)
Ich würde erwarten, dass die ersten vier Punkte ein Cluster bilden würden, und die letzten vier wäre eine andere bilden.
Allerdings erhalte ich
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
die 2. Unter Eigenvektor
-0.0000 -0.5000 0.0000 0.5777 0.0000 -0.4078 -0.0000 0.5000
Ich finde das ein Cluster die Punkte 1,0 enthält; 0,1; 100,100; 101.100 und die anderen Cluster wird aus den Punkten 1,1; 0,0; 100,101; 101,101
Ich frage mich, was mache ich falsch.
Hinweis: Ich arbeite an dem oben genannten als Teil eines Hausaufgabenprojekts.
Vielen Dank im Voraus!