Esiste un algoritmo per stimare la mediana, la modalità, l'asimmetria e / o la curtosi di un insieme di valori, ma questo NON richiede la memorizzazione di tutti i valori contemporaneamente?
Vorrei calcolare le statistiche di base:
- media: media aritmetica
- varianza: media delle deviazioni quadrate dalla media
- deviazione standard: radice quadrata della varianza
- mediana: valore che separa la metà più grande dei numeri dalla metà più piccola
- mode: valore più frequente trovato nel set
- asimmetria: tl; dr
- curtosi: tl; dr
La formula di base per calcolare uno di questi è l'aritmetica della scuola elementare, e io le conosco. Ci sono anche molte librerie di statistiche che le implementano.
Il mio problema è il gran numero (miliardi) di valori nei set che sto gestendo: lavorando in Python, non posso semplicemente creare un elenco o un hash con miliardi di elementi. Anche se ho scritto questo in C, gli array di miliardi di elementi non sono troppo pratici.
I dati non vengono ordinati. Viene prodotto in modo casuale, al volo, da altri processi. La dimensione di ogni set è molto variabile e le dimensioni non saranno note in anticipo.
Ho già capito come gestire la media e la varianza abbastanza bene, ripetendo ogni valore nell'insieme in qualsiasi ordine. (In realtà, nel mio caso, li prendo nell'ordine in cui sono generati.) Ecco l'algoritmo che sto usando, per gentile concessione di http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm :
- Inizializza tre variabili: count, sum e sum_of_squares
- Per ogni valore:
- Conteggio incremento.
- Aggiungi il valore alla somma.
- Aggiungi il quadrato del valore a sum_of_squares.
- Dividi la somma per conteggio, memorizzando come media della variabile.
- Dividi sum_of_squares per count, memorizzando come variabile mean_of_squares.
- Media quadrata, memorizzazione come square_of_mean.
- Sottrai square_of_mean da mean_of_squares, memorizzando come varianza.
- Media e varianza di output.
Questo algoritmo "in linea" ha dei punti deboli (ad esempio, problemi di precisione poiché sum_of_squares cresce rapidamente più grande dell'intervallo intero o della precisione del float), ma fondamentalmente mi dà ciò di cui ho bisogno, senza dover memorizzare ogni valore in ogni set.
Ma non so se esistano tecniche simili per stimare le statistiche aggiuntive (mediana, modo, asimmetria, curtosi). Potrei convivere con uno stimatore parziale, o anche un metodo che compromette l'accuratezza in una certa misura, purché la memoria richiesta per elaborare N valori sia sostanzialmente inferiore a O (N).
Anche indicarmi una libreria di statistiche esistente sarà d'aiuto, se la libreria ha funzioni per calcolare una o più di queste operazioni "on-line".