esiste un algoritmo noto + struttura dati per mantenere un istogramma dinamico?Come mantenere un istogramma dinamico?
Immaginate di avere un flusso di dati (x_1, w_1), (x_2, w_2), ... dove x_t sono doppi, che rappresentano alcune variabili misurate e w_t è il peso associato.
ho potuto solo fare il (codice di pseudo-python) ovvia:
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
Ma ho alcuni problemi con che quando ho un flusso continuo di dati. Non ho il set di dati completo in mano e devo controllare l'istogramma tra la raccolta dei dati. E non ho alcuna aspettativa su:
- le dimensioni bin ideali per non finire con un sacco di bidoni vuoti,
- la gamma dei dati
Quindi mi piacerebbe definire il scomparti dinamicamente. Ho potuto fare la cosa stupida:
for x in data_stream:
data.append(x)
hist = make_histogram(data)
ma credo che questo avrà rallenterà molto rapidamente ...
Se i tutti i pesi in cui la parità una delle cose che ho pensato è stata la memorizzazione dei dati in un array ordinato e l'inserimento di nuovi dati in un modo che ha mantenuto ordinato l'array. In questo modo ho potuto avere:
data = sortedarray();
for x in data_stream:
data.insert(x)
bins = [ data[int(i * data.size()/numbins)] for i in xrange(numbins)]
e il conteggio all'interno di ogni bin sarebbe pari a data.size()/numbins per tutti i contenitori.
Non riesco a pensare a un modo di includere i pesi in questo però ... qualcuno ha un suggerimento? (la conoscenza delle librerie C++ che fanno questo sarebbe benvenuta anche).
EDIT: (per il chiarimento richiesto)
Il x_t sono numeri in virgola mobile. Per calcolare l'istogramma devo dividere l'intervallo continuo in cui le x appartengono a un numero di bin. Quindi avrò una sequenza di numeri bin [0], bin [1], etc ... quindi devo determinare per cosa faccio bin [i] < x < bin [i + 1].
Questo è il modo in cui si esegue di solito un istogramma quando si hanno tutti i dati in anticipo. Dovresti quindi conoscere i limiti max (x) e min (x) e sarebbe facile determinare contenitori adeguati. Potresti averli equamente distanziati tra min (x) e max (x), per esempio.
Se non si conosce l'intervallo in anticipo, non è possibile determinare i raccoglitori. Potresti ricevere una x che non cade in nessun contenitore. Oppure potresti scegliere molti contenitori vuoti perché hai scelto un intervallo troppo grande per creare i contenitori.
Puoi chiarire, se ti interessano solo i pesi, perché non fai semplicemente 'data [x] + = w'? Cosa ti importa oltre ai pesi? – ninjagecko
x è un numero in virgola mobile ... per una sequenza di numeri bin [0], bin [1], ... Devo determinare per quale cosa faccio bin [i]
@ninjagecko vedere la mia modifica per favore. –