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).
Antworten:
Der Median ist der Punkt, an dem 1/2 der Beobachtungen unten und 1/2 oben liegen. In ähnlicher Weise ist das 25. Perzentil der Median für Daten zwischen dem Min und dem Median, und das 75. Perzentil ist der Median zwischen dem Median und dem Max. Also ja, ich denke, Sie sind auf einem soliden Fundament, wenn Sie den Median-Algorithmus anwenden, den Sie zuerst verwenden der gesamte Datensatz, um ihn zu partitionieren, und dann auf die beiden resultierenden Teile.
Update :
Diese Frage zum Stackoverflow führt zu dieser Arbeit: Raj Jain, Imrich Chlamtac: Der P²-Algorithmus zur dynamischen Berechnung von Quantiilen und Histogrammen ohne Speicherung von Beobachtungen. Kommun. ACM 28 (10): 1076-1085 (1985), dessen Zusammenfassung darauf hinweist, dass es für Sie wahrscheinlich von großem Interesse ist:
quelle
Eine geringfügige Änderung der von Ihnen veröffentlichten Methode, mit der Sie ein beliebiges Perzentil berechnen können, ohne alle Quantile berechnen zu müssen. Hier ist der Python-Code:
und ein Beispiel:
quelle