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).