2012-01-09 22 views
16

posible duplicado:
K-means algorithm variation with equal cluster sizegrupo N puntos en k grupos de igual tamaño

EDIT: como casperOne punto que a mí esta pregunta es un duplicado. De todas formas aquí hay una cuestión más generalizada que cubren esta: https://stats.stackexchange.com/questions/8744/clustering-procedure-where-each-cluster-has-an-equal-number-of-points

Mis requisitos

En un proyecto que necesito grupo n puntos (x, y) en k grupos de igual tamaño (n/k) . Donde xey son números flotantes dobles, n puede oscilar entre 100 y 10000 y k puede variar de 2 a 100. También se conoce k antes de que se ejecute el algoritmo.

Mis experimentos

empecé a resolver el problema utilizando el algoritmo http://en.wikipedia.org/wiki/K-means_clustering, que funcionan muy bien y rápido para producir exactamente k grupos de aproximadamente el mismo tamaño.

Pero mi problema es esto, los K-means producen grupos de aproximadamente el mismo tamaño, donde necesito que los conglomerados sean exactamente del mismo tamaño (o para ser más precisos: los necesito para tener un tamaño entre el piso/k) y ceil (n/k)).

Antes de que me lo digas, sí, probé la primera respuesta aquí K-means algorithm variation with equal cluster size, lo cual parece una buena idea.

La idea principal es postprocesar la matriz de producción de clúster mediante K-means. Desde el clúster más grande hasta el más pequeño. Reducimos el tamaño de los clusters que tienen más de n/k miembros moviendo puntos extra a otro clúster más cercano. Dejando solos los grupos que ya están reducidos.

Aquí es el pseudo código Implementé:

n is the number of point 
k is the number of cluster 
m = n/k (the ideal cluster size) 
c is the array of cluster after K-means 
c' = c sorted by size in descending order 
for each cluster i in c' where i = 1 to k - 1 
    n = size of cluster i - m (the number of point to move) 
    loop n times 
     find a point p in cluster i with minimal distance to a cluster j in c' where j > i 
     move point p from cluster i to cluster j 
    end loop 
    recalculate centroids 
end for each 

El problema de este algoritmo es que cerca del final del proceso (cuando i se acercan a k), tenemos que elegir un j clúster en c '(donde j> i porque tenemos que dejar solos los clústers ya procesados), pero este clúster j que encontramos puede estar lejos del clúster i, lo que rompe el concepto de clúster.

Mi pregunta

¿Hay un post algoritmo k-medias o una variante K-significa que puede satisfacer mis necesidades, o estoy mal desde el principio y tengo que encontrar otro algoritmo de agrupamiento?

PD: No me importa implementar la solución yo mismo, pero sería genial si puedo usar una biblioteca, e idealmente en JAVA.

+0

¿Cómo se eligen los clusters iniciales? – mvds

+0

El número de conglomerados y sus centroides iniciales los elige un usuario (humano). –

+0

¿Cuál es su ** criterio de optimalidad **? No creo que usar y luego "arreglar" los resultados de k-means sea el camino a seguir. Puede modificar k-means para asegurarse de que el tamaño permanezca dentro de sus restricciones. –

Respuesta

2

Al no ser un experto en el tema, una vez tuve que encontrar un algoritmo simple para agrupar ubicaciones en un mapa, donde cada punto necesitaba ser parte de un clúster, y los clústeres estaban atados de varias maneras (no solo en tamaño (es decir, conteo de puntos), pero también en algunas otras medidas que dependen de factores variables).

Al encontrar primero los puntos "difíciles", y luego crecer en grupos desde allí, obtuve los mejores resultados. puntos "difíciles" serían los puntos que son difíciles de alcanzar, p.porque estarían solos en las afueras del área total, o porque ayudarían a golpear otra condición de límite del clúster más que otros puntos. Esto ayudó a crecer agrupamientos perfectamente alineados, dejando muy poco solitarios y el trabajo manual correspondiente para colocarlos.

Esto puede ayudarlo si su algoritmo actual normalmente encuentra estos puntos difíciles al final.

+0

Interesante. De hecho, cuando el usuario coloca los centroides iniciales en esos puntos "difíciles" (para que se agreguen primero a un clúster y su clúster crezca a partir de allí), K-means puede producir un diseño agradable de clústeres, pero lamentablemente esos clústeres son nuevamente de diferentes tamaños (conteo de puntos). Ya lo probé. Gracias. ¿Utilizaste una biblioteca/algoritmo existente para satisfacer tus necesidades? –

+0

No, acabo de implementarlo rápido y sucio a mano, comenzó como una simple prueba de concepto, el rendimiento no fue un problema. Debería hacer crecer sus clústeres punto por punto, es decir, en cada ronda, haga crecer cada grupo por uno. Entonces el conteo de puntos no puede divergir. – mvds

+0

Jaja, sí, lo intenté: hacer crecer todos los conglomerados en un punto más cercano en un bucle hasta que no haya ningún punto aislado. Esto apunta al siguiente problema (cerca del final del algoritmo): digamos que tenemos el último punto para ubicar, este punto está cerca del lado izquierdo del grupo A, pero el grupo A ya está lleno, entonces tenemos que elegir el grupo B que está a la derecha del clúster A, B ahora contendrá un punto que debería haber pertenecido a A. –

4

probar este KMeans variación:

Inicialización:

  • elegir k centros del conjunto de datos al azar, o incluso mejor usando kmeans ++ estrategia
  • para cada punto, calcular la distancia a su centro de clúster más cercano y crear un montón para este
  • puntos de extracción del montón, y asignarlos al clúster más cercano, a menos que el clúster ya esté sobrecargado Si es así, calcular el centro del cúmulo más cercano al lado y vuelva a insertar en el montón

Al final, usted debe tener una Paritioning que satisfaga sus requisitos del + -1 mismo número de objetos por grupo (asegúrese de que la última unos pocos los clústeres también tienen el número correcto. Los primeros clústeres m deben tener objetos ceil, el resto exactamente floor objetos). Tenga en cuenta que el uso de un montón asegura que los conglomerados permanezcan convexos: si ya no fueran convexos, habría un mejor candidato de intercambio .

paso de iteración:

requisitos: una lista para cada cluster con "propuestas Swap" (objetos que prefieren estar en un clúster diferente).

E paso: calcular los centros de los conglomerados actualizados como en regular de k-medias

M paso: iterar a través de todos los puntos (o bien sólo uno, o todos en un solo lote)

Compute más cercana centro de clúster para objetar/todos los centros de clúster que están más cerca que los clústeres actuales. Si se trata de un clúster diferente:

  • Si el otro grupo es más pequeño que el clúster actual, sólo se mueven a la nueva agrupación
  • Si hay una propuesta de canje de la otra agrupación (o cualquier grupo con una distancia inferior), intercambie las dos asignaciones de racimo elemento (si hay más de una oferta, elegir el que tenga la mayor mejora)
  • lo contrario, indicar una propuesta de canje para el otro grupo se mantienen

los tamaños de clúster invariante (+ - la diferencia ceil/piso), son objetos solo se movió de un clúster a otro siempre que produzca una mejora de la estimación. Por lo tanto, debería converger en algún punto como k-means. Sin embargo, podría ser un poco más lento (es decir, más iteraciones).

No sé si esto se ha publicado o implementado anteriormente. Es lo que probaría (si intentara k-means. Hay algoritmos de agrupación mucho mejores.)

+0

¡Interesante! Me gusta su idea de una lista de "propuesta de intercambio" por clúster. Probaré eso. Además, dices "hay algoritmos de agrupación mucho mejores": no estoy obligado a K-means, estoy muy abierto a probar otros/mejores algoritmos de clustering que puedan ayudarme a cumplir mis requisitos (n puntos en k clusters de igual tamaño) . Entonces, ¿pueden señalarme algunos de esos algoritmos de agrupamiento más adecuados que pueden generar clústeres de igual tamaño? –

+0

No conozco ninguna para esta tarea específica. No he tenido la necesidad de igual tamaño hasta el momento. –

+0

Me parece que querrá asegurarse de que los puntos no estén asignados a clústeres no adyacentes, de modo que las celdas de Voronoi resultantes sigan siendo convexas, pero no creo que su algoritmo lo haga. – acjay

Cuestiones relacionadas