Ich muss Quartile (Q1, Median und Q3) in Echtzeit mit einer großen Datenmenge berechnen, ohne die Beobachtungen zu speichern. Ich habe zuerst den P-Quadrat-Algorithmus (Jain / Chlamtac) ausprobiert, war aber nicht zufrieden damit (etwas zu viel CPU-Auslastung und nicht überzeugt von der Genauigkeit zumindest meines Datensatzes).
Ich verwende jetzt den FAME-Algorithmus ( Feldman / Shavitt ) zum Schätzen des Medians im laufenden Betrieb und versuche, den Algorithmus so abzuleiten, dass auch Q1 und Q3 berechnet werden:
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
Um fortzufahren, wird einfach der im laufenden Betrieb erhaltene Median M verwendet, um den Datensatz in zwei zu teilen, und dann wird derselbe Algorithmus für Q1 und Q3 wiederverwendet.
Das scheint irgendwie zu funktionieren, aber ich kann nicht demonstrieren (ich bin kein Mathematiker). Ist es fehlerhaft? Ich würde mich über jeden Vorschlag oder jede mögliche andere Technik freuen, die zum Problem passt.
Vielen Dank für Ihre Hilfe !
==== EDIT =====
Für diejenigen, die sich für solche Fragen interessieren, endete ich nach ein paar Wochen damit, Reservoir Sampling mit einem Ausgleichsbehälter von 100 Werten zu verwenden, und es ergab sehr zufriedenstellende Ergebnisse (für mich).