2010-12-09 18 views
5

Ich mache ein Clustering mit K-means in MATLAB. Wie Sie vielleicht die Verwendung wissen, ist, wie folgt:Den Index des nächsten Datenpunkts zu den Zentrioden in Kmeans-Clustering in MATLAB abrufen

[IDX,C] = kmeans(X,k) 

wo IDX die Cluster-Nummer für jeden Datenpunkt in X und C gibt die Schwerpunkte für jede cluster.I brauchen, um den Index (Zeilennummer in der gibt aktueller Datensatz X) des nächstliegenden Datenpunkts zum Schwerpunkt. Weiß jemand wie ich das machen kann? Danke

Antwort

5

Die „Brute-Force-Ansatz“, wie @Dima erwähnt gehen würde wie folgt

%# loop through all clusters 
for iCluster = 1:max(IDX) 
    %# find the points that are part of the current cluster 
    currentPointIdx = find(IDX==iCluster); 
    %# find the index (among points in the cluster) 
    %# of the point that has the smallest Euclidean distance from the centroid 
    %# bsxfun subtracts coordinates, then you sum the squares of 
    %# the distance vectors, then you take the minimum 
    [~,minIdx] = min(sum(bsxfun(@minus,X(currentPointIdx,:),C(iCluster,:)).^2,2)); 
    %# store the index into X (among all the points) 
    closestIdx(iCluster) = currentPointIdx(minIdx); 
end 

Um die Koordinaten des Punktes zu erhalten, die k Nähe des Clusterzentrum ist, verwenden

X(closestIdx(k),:) 
+2

+1 Genau das, was ich schreiben wollte. Ein kleiner Schnitt, ich denke, es sollte sein: 'C (iCluster, :)' anstelle von 'C (iCluster)' – Amro

+0

@Amro: Danke, dass du das gesehen hast! – Jonas

1

Der Brute-Force-Ansatz wäre, k-means auszuführen und dann jeden Datenpunkt im Cluster mit dem Schwerpunkt zu vergleichen und den nächstgelegenen zu finden. Dies ist in Matlab einfach zu machen.

Auf der anderen Seite können Sie versuchen, den k-medoids Clustering-Algorithmus, der Ihnen einen Datenpunkt als "Mittelpunkt" jedes Clusters gibt. Hier ist ein matlab implementation.

0

Eigentlich gibt Kmeans Ihnen bereits die Antwort, wenn ich Sie richtig verstehe:

Verwandte Themen