Tengo algunos puntos en , y quiero agrupar los puntos para que:
Cada grupo contiene un número igual de elementos de . (Suponga que el número de grupos divide .)
Cada grupo es "espacialmente cohesivo" en algún sentido, como los grupos de significa.
Es fácil pensar en muchos procedimientos de agrupamiento que satisfacen uno u otro de estos, pero ¿alguien sabe de una manera de obtener ambos a la vez?
machine-learning
clustering
k-means
unsupervised-learning
No Durrett
fuente
fuente
Respuestas:
Sugiero un enfoque de dos pasos:
Obtenga una buena estimación inicial de los centros de los conglomerados, por ejemplo, utilizando K-medias difusos o difusos.
Use la asignación de Vecino más cercano global para asociar puntos con centros de clúster: Calcule una matriz de distancia entre cada punto y cada centro de clúster (puede hacer que el problema sea un poco más pequeño calculando solo distancias razonables), replique cada centro de clúster X veces y resuelva el lineal problema de asignación . Obtendrá, para cada centro de clúster, exactamente X coincide con los puntos de datos, de modo que, globalmente, se minimiza la distancia entre los puntos de datos y los centros de clúster.
Tenga en cuenta que puede actualizar los centros de clúster después del paso 2 y repetir el paso 2 para ejecutar básicamente K-means con un número fijo de puntos por clúster. Aún así, será una buena idea obtener una buena suposición inicial primero.
fuente
Pruebe esta variación k-means:
Inicializacion :
k
centros del conjunto de datos al azar, o incluso mejor usando la estrategia kmeans ++Al final, debe tener una partición que satisfaga sus requisitos del + -1 mismo número de objetos por grupo (asegúrese de que los últimos grupos también tengan el número correcto. Los primeros
m
grupos deben tenerceil
objetos, el resto exactamentefloor
objetos).Paso de iteración :
Requisitos: una lista para cada grupo con "propuestas de intercambio" (objetos que preferirían estar en un grupo diferente).
Paso E : calcule los centros de clúster actualizados como en k-means regulares
Paso M : iterando a través de todos los puntos (ya sea solo uno o todo en un lote)
Calcule el centro de clúster más cercano al objeto / todos los centros de clúster que estén más cerca que los clústeres actuales. Si es un clúster diferente:
Los tamaños de los conglomerados permanecen invariables (+ - la diferencia de techo / piso), los objetos solo se mueven de un conglomerado a otro siempre que resulte en 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 antes. Es justo lo que intentaría (si intentara k-means. Hay algoritmos de agrupamiento mucho mejores).
Un buen lugar para comenzar podría ser con la implementación de k-means en ELKI , que ya parece admitir tres inicializaciones diferentes (incluyendo k-means ++), y los autores dijeron que también quieren tener diferentes estrategias de iteración, para cubrir todas las diversas variantes de forma modular (por ejemplo, Lloyd, MacQueen, ...).
fuente
Este es un problema de optimización. Tenemos una biblioteca Java de código abierto que resuelve este problema (agrupamiento donde la cantidad por grupo debe estar entre los rangos establecidos). Sin embargo, necesitaría que su número total de puntos sea un máximo de unos pocos miles, no más de 5000 o quizás 10000.
La biblioteca está aquí:
https://github.com/PGWelch/territorium/tree/master/territorium.core
La biblioteca en sí está configurada para problemas geográficos / tipo SIG, por lo que verá referencias a X e Ys, latitudes y longitudes, clientes, distancia y tiempo, etc. Sin embargo, puede ignorar los elementos 'geográficos' y usarlo como un puro clusterer
Proporciona un conjunto de grupos de entrada inicialmente vacíos, cada uno con una cantidad objetivo mínima y máxima. El clusterer asignará puntos a sus grupos de entrada, utilizando un algoritmo de optimización basado en heurística (swaps, movimientos, etc.). En la optimización, prioriza en primer lugar mantener cada grupo dentro de su rango de cantidad mínima y máxima y luego minimiza en segundo lugar las distancias entre todos los puntos en el grupo y el punto central del grupo, por lo que un grupo es espacialmente cohesivo.
Usted le da al solucionador una función métrica (es decir, función de distancia) entre puntos usando esta interfaz:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/TravelMatrix.java
La métrica en realidad está estructurada para devolver tanto la distancia como el 'tiempo', porque está diseñada para problemas geográficos basados en viajes, pero para problemas de agrupamiento arbitrario simplemente establece que 'tiempo' sea cero y la distancia sea la métrica real que estás usando entre puntos.
Configuraría su problema en esta clase:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Problem.java
Sus puntos serían los 'Clientes' y su cantidad sería 1. En la clase de cliente, asegúrese de establecer costPerUnitTime = 0 y costPerUnitDistance = 1 suponiendo que devuelve su distancia métrica en el campo 'distancia' devuelta por TravelMatrix.
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Customer.java
Vea aquí un ejemplo de ejecución del solucionador:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/test/java/com/opendoorlogistics/territorium/TestSolver.java
fuente
Sugiero el reciente artículo Discriminative Clustering by Regularized Information Maximization (y referencias en él). Específicamente, la Sección 2 habla sobre el equilibrio de clase y el supuesto de agrupación.
fuente
Recientemente, yo mismo necesitaba esto para un conjunto de datos no muy grande. Mi respuesta, aunque tiene un tiempo de ejecución relativamente largo, está garantizado para converger a un óptimo local.
fuente