38 votos

Determinar los diferentes grupos de datos 1d de la base de datos

Tengo una tabla de base de datos de transferencias de datos entre diferentes nodos. Se trata de una base de datos enorme (con casi 40 millones de transferencias). Uno de los atributos es el número de bytes (nbytes) transferidos, que van desde 0 bytes hasta 2 tera bytes. Me gustaría agrupar los nbytes de manera que, dados k clusters, algunas transferencias x1 pertenezcan al cluster k1, las transferencias x2 al k2, etc.

Por la terminología que he utilizado, habrás adivinado a qué iba: K-means. Se trata de 1d datos ya que nbytes es la única característica que me importa. Cuando estaba buscando diferentes métodos para esto vi que el EM fue mencionado un par de veces junto con un enfoque de no agrupamiento. Me gustaría conocer sus opiniones sobre cómo abordar este problema (específicamente si se debe agrupar o no).

Gracias.

65voto

Amadiere Puntos 5606

En datos unidimensionales, no utilice el análisis de conglomerados.

El análisis de conglomerados suele ser una técnica multivariante. O mejor dicho, para datos unidimensionales, que están completamente ordenados, hay técnicas mucho mejores. Usar k-means y técnicas similares aquí es un total desperdicio, a menos que se ponga el suficiente esfuerzo para optimizarlas realmente para el caso 1-d.

Por poner un ejemplo: para k-means es habitual utilizar k objetos aleatorios como semillas iniciales. Para datos unidimensionales, es bastante fácil hacerlo mejor simplemente utilizando los cuantiles apropiados (1/2k, 3/2k, 5/2k, etc.), después de ordenar los datos una vez y luego optimizar desde este punto de partida. Sin embargo, los datos en 2D no se pueden ordenar completamente. Y en una cuadrícula, es probable que haya celdas vacías.

Tampoco lo llamaría racimo. Lo llamaría intervalo . Lo que realmente quieres hacer es optimizar los bordes del intervalo. Si haces k-means, probará para cada objeto si debe ser movido a otro cluster. Eso no tiene sentido en 1D: sólo hay que comprobar los objetos en los bordes del intervalo. Obviamente, esto es mucho más rápido, ya que sólo hay ~2k objetos allí. Si no prefieren otros intervalos, los objetos más centrales tampoco lo harán.

Puede que quieras buscar técnicas como Optimización de Jenks Natural Breaks por ejemplo.

O puede hacer un estimación de la densidad del núcleo y buscar los mínimos locales de la densidad para dividir allí. ¡Lo bueno es que no es necesario especificar k para esto!

Ver esta respuesta para ver un ejemplo de cómo hacer esto en Python (los marcadores verdes son los modos de los clusters; los rojos, los puntos en los que se cortan los datos; el eje y es una probabilidad logarítmica de la densidad):

KDE with Python

P.D. Por favor, utilice la función de búsqueda. Aquí hay algunas preguntas sobre la agrupación de datos en 1-d que se perdieron:

5voto

lkamal Puntos 121

La agrupación unidimensional puede realizarse de forma óptima y eficaz, lo que puede permitirle conocer la estructura de sus datos.

¡En el caso unidimensional, hay métodos que son óptimos y eficientes (O(kn)), y como bonus hay incluso algoritmos de clustering regularizados que le permitirán seleccionar automáticamente el número de clusters! Recomiendo este estudio: https://cs.au.dk/~larsen/papers/1dkmeans.pdf Las implementaciones en R se pueden encontrar en el paquete Ckmeans.1d.dp: https://cran.r-project.org/web/packages/Ckmeans.1d.dp/index.html

Como nota al margen, el clustering unidimensional puede utilizarse para la cuantificación, donde se representan los datos de entrada utilizando un conjunto más pequeño de valores; esto puede ayudar a la compresión, o a acelerar la búsqueda, por ejemplo.

1voto

Bitwise Puntos 3141

¿Su pregunta es si debe agrupar o qué método debe utilizar para agrupar?

En cuanto a la conveniencia de crear un clúster, depende de si desea particionar automáticamente sus datos (por ejemplo, si desea repetir esta partición varias veces). Si lo haces una sola vez, puedes simplemente mirar el histograma de la distribución de tus valores, y hacer la partición a ojo, como se propone en los comentarios. Yo recomendaría mirar los datos a ojo de todos modos, ya que podría ayudarte a determinar cuántos clusters quieres y también si la agrupación "funcionó".

En cuanto al tipo de clustering, k-means debería estar bien si hay clusters "reales" en los datos. Si no ve ningún clúster en el histograma, no tiene mucho sentido agruparlo de todos modos, ya que cualquier partición de su rango de datos dará clústeres válidos (o en el caso de la iniciación aleatoria de kmeans, obtendrá diferentes clústeres en cada ejecución).

1voto

Amarpreet Singh Puntos 145

Puedes probar:

  1. KMeans, GMM u otros métodos especificando n_clusters= número de picos en el gráfico de densidad del núcleo.

  2. KMeans, GMM u otros métodos determinando el número óptimo de clusters en función de algunas métricas. Más información: [aquí] https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X