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.
¿Cómo se eligen los clusters iniciales? – mvds
El número de conglomerados y sus centroides iniciales los elige un usuario (humano). –
¿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. –