¿Cómo 'inteligente' bin una colección de datos ordenados?

11

Estoy tratando de agrupar inteligentemente una colección ordenada. Tengo una colección de piezas de datos. Pero sé que estos datos se ajustan a contenedores de tamaños desiguales. No sé cómo elegir inteligentemente los puntos finales para que se ajusten adecuadamente a los datos. por ejemplo:nm

Digamos que tengo 12 elementos en mi colección, y sé que los datos encajarán en 3 contenedores:

Index:  1 2 3 4 5 6 7 8 9 10 11 12
Value:  1 1 1 3 3 3 3 3 3 5  5  6

¿Cómo elijo inteligentemente mis puntos de interrupción para los contenedores de ?i={13},{49},{1012}

La implementación actual que tengo divide los datos en bins de tamaño uniforme y luego toma el promedio de los puntos finales para encontrar los índices para el final de los bins. Entonces funciona así:

Index:  1 2 3 4 5 6 7 8 9 10 11 12
Value:  1 1 1 3 3 3 3 3 3 5  5  6

first break evenly: i = 1-4, 5-8, 9-12
mean endpoints:  between 4 and 5: (3+3)/2 = 3
                 between 8 and 9: (3+3)/2 = 3

Así que ahora cualquier cosa por debajo de 3 cabe en la bandeja 1, cualquier cosa por encima de 3 pero por debajo de 3 cabe en la bandeja 2, y cualquier cosa por encima de 3 cabe en la bandeja 3. Puede ver cuál es mi problema. Si los datos tienen bins desiguales, mi método falla.

Un amigo mencionó el algoritmo vecino k-más cercano pero no estoy seguro.

Matthew Kemnetz
fuente
1
¿Podría explicar qué significa "inteligentemente"? ¿Qué estás tratando de lograr con el binning? ¿Por qué estás binning en primer lugar?
whuber
Para su penúltimo párrafo, ¿quiere decir , y ? De lo contrario, no tiene sentido para mí. <3bin13&<4bin24bin3
gung - Restablece a Monica
Quiero decir inteligentemente, como no ingenuamente como lo hice asumiendo que los contenedores estaban espaciados uniformemente. si un dato cae en un contenedor específico que me dice algo muy importante sobre ese dato. Ordeno los datos para determinar los índices de ruptura del contenedor y luego decido en qué contenedor cae cada dato individualmente.
Matthew Kemnetz
a menos que haya hecho algo mal en mi promedio, creo que lo he hecho bien. eligiendo incluso; los espacios separados y todos mis puntos finales son 3. Por lo tanto, no puedo bin mis datos correctamente. Esta es la razón por la cual mi implementación se descompone sin siquiera espacios separados.
Matthew Kemnetz
Aquí hay algo que hice en un entorno ligeramente diferente.
Macro

Respuestas:

9

Creo que lo que quieres hacer se llama agrupación. Desea agrupar sus "valores" de tal manera que se recopilen valores similares en el mismo contenedor y el número total de contenedores esté preestablecido.

Puede resolver este problema utilizando el algoritmo de agrupación k-means . En MATLAB, puede hacer esto:

bin_ids = kmeans(Values,3); 

La llamada anterior agrupará los valores en Valuestres grupos, de modo que la varianza dentro del grupo sea mínima.

emrea
fuente
1
También lo descubrí. Esto es exactamente lo que implementé y funcionó de manera excelente. ¡Vine aquí para responder mi propia pregunta pero me ganaste! Agrupar era lo que estaba tratando de hacer.
Matthew Kemnetz
8

k-means es una opción, pero no es muy sensible para datos unidimensionales. En los datos unidimensionales, tiene un enorme beneficio: los datos se pueden ordenar por completo.

Eche un vistazo a la optimización de pausas naturales :
http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization

HA SALIDO - Anony-Mousse
fuente
Esto es extremadamente interesante ¿Podría posiblemente entrar en más detalles sobre por qué esto podría ser mejor de lo que k significa?
Matthew Kemnetz
La razón principal por la que pregunto es porque estoy usando MATLAB para mi algoritmo y no pude encontrar ninguna optimización de interrupciones naturales de Jenks en ninguna caja de herramientas, etc., por lo que tendré que implementar la mía. Solo quería saber cuánto mejor / más rápido podría ser esto antes de cambiar de marcha e implementar esto.
Matthew Kemnetz
1
k-means es bastante estúpido. Tiene medios, y siempre se dividirá en el medio de los dos medios. Entonces dado, por ejemplo, 0 1 2 3 4 5 7 7 7, k-means preferirá dividir entre 4 y 5. A veces incluso se dividirá entre 3 y 4.
Ha QUITADO - Anony-Mousse