2009-09-03 11 views
7

Ich habe eine Matrize von A (369x10), die ich in 19 Cluster gruppieren möchte. Ich benutze diese MethodeMatlab: K-bedeutet Clustering

[idx ctrs]=kmeans(A,19) 

die idx (369x1) und ctrs (19x10)

ich den Punkt bis here.All meine Zeilen in A ergibt, wird in 19 Clustern gebündelt.

Jetzt habe ich ein Array B (49x10). Ich möchte wissen, wo die Zeilen dieses B entspricht in der unter 19 Cluster.

Wie ist es in MATLAB möglich?

Vielen Dank im Voraus

+0

Welche Ausgabe erwarten Sie? – SilentGhost

+0

Nehmen wir an, meine Cluster sind p1..p19. und ich habe einen Testdatenpunkt, den ich aus Testdaten, die ich beim Clustering verwende, zufällig auswähle. Ich möchte so etwas sehen; "Meine Testdaten gehören zu p5" – tguclu

+2

Ich fand einen Weg, aber nicht sicher, ob das stimmt. ctrs enthält die Zentren jedes Clusters. Wenn ich die euklidische Distanz btw Elemente von ctrs und meine Testdaten berechne und den minimalen Index erhalte, dann gebe ich den Clusterindex, zu dem meine Testdaten gehören. irgendwelche Ideen? – tguclu

Antwort

4

Ich kann nicht einen besseren Weg denken, es als zu tun, was Sie beschrieben. Eine eingebaute Funktion würde eine Zeile speichern, aber ich konnte keine finden. Hier ist der Code ist würde ich verwenden:

[ids ctrs]=kmeans(A,19); 
D = dist([testpoint;ctrs]); %testpoint is 1x10 and D will be 20x20 
[distance testpointID] = min(D(1,2:end)); 
0

für kleine Datenmenge, könnten Sie

[testpointID,dum] = find(permute(all(bsxfun(@eq,B,permute(ctrs,[3,2,1])),2),[3,1,2])) 

tun, aber das ist etwas dunkel; die bsxfun mit den permutierten ctrs erstellt ein 49 x 10 x 19 Array von Booleans, das dann über die zweite Dimension "all-ed" wird, permutiert zurück und dann die Zeilen-IDs gefunden werden. wieder, wahrscheinlich nicht für große Datenmengen geeignet.

1

Sie verwenden quadratische euklidische Abstandsmetrik Unter der Annahme, versuchen Sie dies:

for i = 1:size(ctrs,2) 
d(:,i) = sum((B-ctrs(repmat(i,size(B,1),1),:)).^2,2); 
end 
[distances,predicted] = min(d,[],2) 

vorhergesagt sollte dann den Index des nächsten Schwerpunkt enthalten, und Entfernungen die Entfernungen zu den nächsten Schwerpunkt enthalten sollte.

Werfen Sie einen Blick in die Funktion kmeans bei der Unterfunktion 'distfun'. Dies zeigt Ihnen, wie Sie das obige tun, und enthält auch die Entsprechungen für andere Distanzmetriken.

11

Das Folgende ist ein ein vollständiges Beispiel für Clustering:

%% generate sample data 
K = 3; 
numObservarations = 100; 
dimensions = 3; 
data = rand([numObservarations dimensions]); 

%% cluster 
opts = statset('MaxIter', 500, 'Display', 'iter'); 
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ... 
    'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3); 

%% plot data+clusters 
figure, hold on 
scatter3(data(:,1),data(:,2),data(:,3), 50, clustIDX, 'filled') 
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled') 
hold off, xlabel('x'), ylabel('y'), zlabel('z') 

%% plot clusters quality 
figure 
[silh,h] = silhouette(data, clustIDX); 
avrgScore = mean(silh); 


%% Assign data to clusters 
% calculate distance (squared) of all instances to each cluster centroid 
D = zeros(numObservarations, K);  % init distances 
for k=1:K 
    %d = sum((x-y).^2).^0.5 
    D(:,k) = sum(((data - repmat(clusters(k,:),numObservarations,1)).^2), 2); 
end 

% find for all instances the cluster closet to it 
[minDists, clusterIndices] = min(D, [], 2); 

% compare it with what you expect it to be 
sum(clusterIndices == clustIDX) 
2

Ich weiß nicht, ob ich Ihre Bedeutung richtig zu machen, aber wenn Sie wissen möchten, welche Cluster Ihre Punkte gehören Sie KnnSearch Funktion leicht nutzen können. Es hat zwei Argumente und sucht im ersten Argument nach dem ersten Argument, das dem zweiten Argument am nächsten kommt.