Devo calcolare i quartili (Q1, mediana e Q3) in tempo reale su un ampio set di dati senza memorizzare le osservazioni. Per prima cosa ho provato l'algoritmo P square (Jain / Chlamtac) ma non ero soddisfatto (un po 'troppo utilizzo della CPU e non convinto almeno dalla precisione sul mio set di dati).
Ora uso l'algoritmo FAME ( Feldman / Shavitt ) per stimare la mediana al volo e provo a derivare l'algoritmo per calcolare anche Q1 e Q3:
M = Q1 = Q3 = first data value
step =step_Q1 = step_Q3 = a small value
for each new data :
# update median M
if M > data:
M = M - step
elif M < data:
M = M + step
if abs(data-M) < step:
step = step /2
# estimate Q1 using M
if data < M:
if Q1 > data:
Q1 = Q1 - step_Q1
elif Q1 < data:
Q1 = Q1 + step_Q1
if abs(data - Q1) < step_Q1:
step_Q1 = step_Q1/2
# estimate Q3 using M
elif data > M:
if Q3 > data:
Q3 = Q3 - step_Q3
elif Q3 < data:
Q3 = Q3 + step_Q3
if abs(data-Q3) < step_Q3:
step_Q3 = step_Q3 /2
Per riprendere, utilizza semplicemente la mediana M ottenuta al volo per dividere il set di dati in due e quindi riutilizzare lo stesso algoritmo per Q1 e Q3.
Questo sembra funzionare in qualche modo ma non sono in grado di dimostrare (non sono un matematico). È agitato? Gradirei qualsiasi suggerimento o eventuale altra tecnica adatta al problema.
Grazie mille per il tuo aiuto !
==== EDIT =====
Per coloro che sono interessati a tali domande, dopo alcune settimane, ho finalmente finito semplicemente usando il Reservoir Sampling con un riverbero di 100 valori e questo mi ha dato risultati molto sontuosi (per me).