2010-12-09 17 views
5

Estoy haciendo algunos clústeres usando K-means en MATLAB. Como se puede saber el uso es la siguiente:Obteniendo el índice del punto de datos más cercano a los centríodos en la agrupación de Kmeans en MATLAB

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

donde IDX da el número de clúster para cada punto de datos en X, y C da los centroides para cada cluster.I necesitan para obtener el número de índice (fila de la conjunto de datos reales X) del punto de datos más cercano al centroide. ¿Alguien sabe cómo puedo hacer eso? Gracias

Respuesta

5

El "enfoque de fuerza bruta", como se ha mencionado por @Dima iría de la siguiente manera

%# 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 

para obtener las coordenadas del punto que está más cerca del centro del cúmulo k, utilice

X(closestIdx(k),:) 
+2

+1 Exactamente lo que estaba a punto de publicar. Una pequeña edición, creo que debería ser: 'C (iCluster, :)' en lugar de 'C (iCluster)' – Amro

+0

@Amro: ¡Gracias por detectar esto! – Jonas

1

El enfoque de la fuerza bruta sería ejecutar k-medias, y luego comparar cada punto de datos en el grupo al centroide, y encontrar el más cercano a él. Esto es fácil de hacer en Matlab.

Por otro lado, es posible que desee probar el algoritmo de agrupamiento k-medoids, que le proporciona un punto de datos como el "centro" de cada clúster. Aquí hay un matlab implementation.

0

En realidad, kmeans ya le da la respuesta, si le entiendo bien:

[IDX,C, ~, D] = kmeans(X,k); % D is the distance of each datapoint to each of the clusters 
[minD, indMinD] = min(D); % indMinD(i) is the index (in X) of closest point to the i-th centroid 
Cuestiones relacionadas