Hasta donde yo sé, k-means selecciona los centros iniciales al azar. Como se basan en pura suerte, pueden seleccionarse realmente mal. El algoritmo K-means ++ intenta resolver este problema, extendiendo los centros iniciales de manera uniforme.
¿Los dos algoritmos garantizan los mismos resultados? O es posible que los centroides iniciales mal elegidos conduzcan a un mal resultado, sin importar cuántas iteraciones.
Digamos que hay un conjunto de datos dado y un número dado de grupos deseados. Ejecutamos un algoritmo k-means siempre que converja (no más movimiento central). ¿Existe una solución exacta para este problema de clúster (dado SSE), o k-means producirá resultados a veces diferentes en la repetición?
Si hay más de una solución a un problema de agrupación (conjunto de datos dado, número de agrupaciones dado), ¿K-means ++ garantiza un mejor resultado, o simplemente un proceso más rápido? Por mejor quiero decir SSE más bajo.
La razón por la que hago estas preguntas es porque estoy buscando un algoritmo k-means para agrupar un gran conjunto de datos. He encontrado algunos k-means ++, pero también hay algunas implementaciones de CUDA. Como ya sabe, CUDA está utilizando la GPU, y puede ejecutar más de cientos de hilos en paralelo. (Por lo tanto, realmente puede acelerar todo el proceso). Pero ninguna de las implementaciones de CUDA, que he encontrado hasta ahora, tiene inicialización k-means ++.
k-means picks the initial centers randomly
. Elegir centros iniciales no es parte del algoritmo k-means en sí. Los centros se pueden elegir cualquiera. Una buena implementación de k-means ofrecerá varias opciones para definir los centros iniciales (aleatorio, definido por el usuario, k-puntos máximos, etc.)Respuestas:
K-means comienza con la asignación aleatoria de centros de clúster y luego busca "mejores" soluciones. K-means ++ comienza con la asignación aleatoria de un centro de clúster y luego busca otros centros dados el primero. Por lo tanto, ambos algoritmos usan la inicialización aleatoria como punto de partida, por lo que pueden dar diferentes resultados en diferentes ejecuciones. Como ejemplo, puede consultar esta conferencia: Agrupación como problema de inferencia de ejemplo , alrededor de 40 minutos hay ejemplos de corridas de k-means, pero toda la conferencia es interesante.
Entonces, respondiendo a sus preguntas:
En cuanto a su problema: lo que significa k-++ ++ elige los centros y luego comienza un k-means "clásico". Entonces, lo que puede hacer es (1) usar la parte del algoritmo que elige los centros y luego (2) usar esos centros en las implementaciones de GPU de k-means. De esta manera, al menos una parte de un problema se resuelve en un software basado en GPU, por lo que debería ser más rápido.
fuente
Visualización de los centroides iniciales de K-means y K-means ++
Para agregar una vista intuitiva de la diferencia entre los centroides iniciales de los dos algoritmos, considere el siguiente conjunto de datos de juguete que consta de tres cuadrados generados uniformemente
Aquí hay histogramas 2D que muestran dónde los algoritmos k-means y k-means ++ inicializan sus centroides iniciales (simulaciones 2000).
Claramente, el k-means estándar inicializa los puntos de manera uniforme, mientras que k-means ++ tiende a inicializarse cerca del centro de los cuadrados
fuente
Muchas veces, la inicialización aleatoria de KMeans lleva menos tiempo que KMeans ++, pero da un resultado deficiente. Debido a la inicialización aleatoria muchas veces obtenemos un óptimo local porque nuestro conjunto inicial de centros no se distribuye sobre el conjunto de datos.
Entonces, respondiendo a tu pregunta:
fuente