J'ai besoin de calculer les quartiles (Q1, médiane et Q3) en temps réel sur un grand ensemble de données sans stocker les observations. J'ai d'abord essayé l'algorithme P carré (Jain / Chlamtac) mais je n'en étais pas satisfait (un peu trop d'utilisation du processeur et pas convaincu par la précision au moins sur mon jeu de données).
J'utilise maintenant l'algorithme FAME ( Feldman / Shavitt ) pour estimer la médiane à la volée et essayer de dériver l'algorithme pour calculer également Q1 et 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
Pour reprendre, il utilise simplement la médiane M obtenue à la volée pour diviser l'ensemble de données en deux, puis réutiliser le même algorithme pour Q1 et Q3.
Cela semble fonctionner d'une manière ou d'une autre, mais je ne suis pas en mesure de démontrer (je ne suis pas mathématicien). Est-il défectueux? J'apprécierais toute suggestion ou toute autre technique éventuelle adaptée au problème.
Merci beaucoup pour votre aide !
==== EDIT =====
Pour ceux qui sont intéressés par de telles questions, après quelques semaines, j'ai finalement fini par simplement utiliser Reservoir Sampling avec un revervoir de 100 valeurs et cela a donné des résultats très satisfaisants (pour moi).