¿existe un algoritmo conocido + estructura de datos para mantener un histograma dinámico?¿Cómo mantener un histograma dinámico?
Imagine que tengo una secuencia de datos (x_1, w_1), (x_2, w_2), ... donde los x_t son dobles, que representan una variable medida y w_t es el peso asociado.
tan sólo pudiera hacer la (pseudo código en Python) obvia:
x0,xN = 0, 10
numbins = 100
hist = [(x0 + i * delta , 0) for i in xrange(numbins)]
def updateHistogram(x, w):
k = lookup(x, hist) #find the adequated bin where to put x
hist[k][1] += 1
pero tengo algunos problemas con eso cuando tengo un flujo continuo de datos. No tengo el conjunto de datos completo en las manos, y tengo que verificar el histograma entre la recopilación de datos. Y no tengo ninguna expectativa sobre:
- los tamaños bin ideales para no terminar con una gran cantidad de contenedores vacíos,
- el rango de los datos
Así que me gustaría definir el Papeleras dinámicamente. Podría hacer lo estúpida:
for x in data_stream:
data.append(x)
hist = make_histogram(data)
pero supongo que esto va a ser lento muy rápidamente ...
Si los pesos de todos los que la igualdad de una de las cosas que pensé que era el almacenamiento de los datos en una matriz ordenada e insertando nuevos datos de una manera que mantiene ordenada la matriz. Esta manera de que pudiera tener:
data = sortedarray();
for x in data_stream:
data.insert(x)
bins = [ data[int(i * data.size()/numbins)] for i in xrange(numbins)]
y el recuento dentro de cada bin serían iguales a data.size()/numbins para todos los contenedores.
No puedo pensar en una forma de incluir los pesos en esto ... ¿alguien tiene alguna sugerencia? (También sería bienvenido el conocimiento sobre las bibliotecas de C++ que hacen esto).
EDIT: (para la clarificación pedido)
El x_t son números de punto flotante. Para calcular el histograma, debo dividir el rango continuo en el que las x pertenecen en varios compartimientos. Así que tendré una secuencia de números bin [0], bin [1], etc ... así que debo determinar por qué lo hago bin [i] < x < bin [i + 1].
Así es como suele hacer un histograma cuando tiene todos los datos de antemano. Entonces conocería los límites max (x) y min (x) y sería fácil determinar los contenedores adecuados. Podría tenerlos igualmente espaciados entre min (x) y max (x), por ejemplo.
Si no conoce el rango de antemano, no puede determinar las ubicaciones. Podría recibir una x que no caiga en ningún contenedor. O podría haber muchos contenedores vacíos porque eligió un rango demasiado grande para crear los contenedores.
¿Puedes aclarar, si solo te importan los pesos, por qué simplemente no haces 'data [x] + = w'? ¿Qué te importa además de los pesos? – ninjagecko
x es un número de coma flotante ... para una secuencia de números bin [0], bin [1], ... Debo determinar para qué bin [i]
@ninjagecko mira mi edición por favor. –