Come trovo la media in un GRANDE insieme di numeri?

Come trovo la media in un GRANDE insieme di numeri?

Puoi campionare casualmente dal tuo set ("popolazione") per ottenere una media ("media"). L'accuratezza sarà determinata da quanto variano i tuoi campioni (come determinato da "deviazione standard" o varianza).

Il vantaggio è che hai miliardi di osservazioni e devi solo campionarne una frazione per ottenere una precisione decente o il "intervallo di confidenza" di tua scelta. Se le condizioni sono giuste, questo riduce la quantità di lavoro che farai.

Ecco una libreria numerica per C# che include un generatore di sequenze casuali. Basta creare una sequenza casuale di numeri che faccia riferimento a indici nella tua matrice di elementi (da 1 a x , il numero di elementi nell'array). Dereference per ottenere i valori, quindi calcolare la media e la deviazione standard.

Se vuoi testare la distribuzione dei tuoi dati, prendi in considerazione l'utilizzo del test Chi-Squared Fit o del test KS, che troverai in molti fogli di calcolo e pacchetti statistici (ad es. R). Ciò contribuirà a confermare se questo approccio è utilizzabile o meno.


Numeri interi o float?

Se sono numeri interi, devi accumulare una distribuzione di frequenza leggendo i numeri e registrando quanti di ogni valore vedi. La media può essere facilmente calcolata.

Per la virgola mobile, questo è un po' un problema. Data la gamma complessiva dei float e la distribuzione effettiva, devi elaborare una dimensione del contenitore che preservi la precisione desiderata senza preservare tutti i numeri.

Modifica

Innanzitutto, devi campionare i tuoi dati per ottenere una media e una deviazione standard. Poche migliaia di punti dovrebbero bastare.

Quindi, è necessario determinare un intervallo rispettabile. La gente sceglie cose come ±6σ (deviazioni standard) attorno alla media. Dividerai questa gamma in quanti più secchi puoi sopportare.

In effetti, il numero di bucket determina il numero di cifre significative nella tua media. Quindi, scegli 10.000 o 100.000 bucket per ottenere 4 o 5 cifre di precisione. Poiché si tratta di una misurazione, è probabile che le tue misurazioni abbiano solo due o tre cifre.

Modifica

Quello che scoprirai è che la media del tuo campione iniziale è molto vicina alla media di qualsiasi altro campione. E qualsiasi media campionaria è vicina alla media della popolazione. Noterai che la maggior parte (ma non tutti) dei tuoi mezzi sono con 1 deviazione standard l'uno dall'altro.

Dovresti scoprire che i tuoi errori e imprecisioni di misurazione sono maggiori della tua deviazione standard.

Ciò significa che una media campionaria è utile quanto una media della popolazione.


Una media mobile non sarebbe precisa come qualsiasi altra cosa (scontando gli errori di arrotondamento, intendo)? Potrebbe essere un po' lento a causa di tutte le divisioni.

Potresti raggruppare lotti di numeri e calcolarne la media in modo ricorsivo. Come media 100 numeri 100 volte, quindi media il risultato. Questo sarebbe meno thrashing e principalmente un'aggiunta.

In effetti, se aggiungi 256 o 512 contemporaneamente potresti essere in grado di spostare il risultato di 8 o 9 (credo che potresti farlo in un doppio semplicemente cambiando la mantissa in virgola mobile) - questo renderebbe il tuo programma è estremamente veloce e potrebbe essere scritto in modo ricorsivo in poche righe di codice (senza contare l'operazione non sicura del turno di mantissa).

Forse dividendo per 256 utilizzerebbe già questa ottimizzazione? Potrei dover eseguire il test di velocità dividendo per 255 rispetto a 256 e vedere se c'è qualche enorme miglioramento. Immagino di no.