Muszę obliczyć kwartyle (Q1, mediana i Q3) w czasie rzeczywistym na dużym zestawie danych bez zapisywania obserwacji. Najpierw wypróbowałem algorytm P-kwadrat (Jain / Chlamtac), ale nie byłem z niego zadowolony (nieco za dużo procesora i nie przekonałem się precyzją przynajmniej w moim zestawie danych).
Używam teraz algorytmu FAME ( Feldman / Shavitt ) do szacowania mediany w locie i próbuję wyprowadzić algorytm, aby obliczyć również Q1 i 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
Aby wznowić, po prostu używa mediany M uzyskanej w locie, aby podzielić zestaw danych na dwie części, a następnie ponownie użyć tego samego algorytmu zarówno dla Q1, jak i Q3.
To wydaje się działać jakoś, ale nie jestem w stanie tego zademonstrować (nie jestem matematykiem). Czy to jest wadliwe? Byłbym wdzięczny za wszelkie sugestie lub inne techniki pasujące do problemu.
Bardzo ci dziękuje za pomoc !
==== EDYCJA =====
Dla tych, którzy są zainteresowani takimi pytaniami, po kilku tygodniach w końcu skończyłem po prostu z użyciem próbkowania w zbiorniku z rewervoir 100 wartości i dało to bardzo satysfakcjonujące wyniki (dla mnie).
Odpowiedzi:
Mediana to punkt, w którym 1/2 obserwacji spada poniżej i 1/2 powyżej. Podobnie 25. perecentyl jest medianą danych między min a medianą, a 75 percentyl jest medianą między medianą a maksimum, więc tak, myślę, że jesteś na solidnym gruncie, stosując dowolny algorytm mediany, którego użyjesz najpierw cały zestaw danych, aby go podzielić na partycje, a następnie na dwóch wynikowych elementach.
Aktualizacja :
To pytanie dotyczące przepełnienia stosu prowadzi do tego artykułu: Raj Jain, Imrich Chlamtac: Algorytm P² do dynamicznego obliczania ilości i histogramów bez przechowywania obserwacji. Commun ACM 28 (10): 1076-1085 (1985), którego streszczenie wskazuje, że prawdopodobnie jest to dla ciebie bardzo interesujące:
źródło
Bardzo niewielka zmiana w opublikowanej metodzie i można obliczyć dowolny dowolny percentyl, bez konieczności obliczania wszystkich kwantyli. Oto kod Python:
i przykład:
źródło