Мені потрібно обчислювати квартілі (Q1, медіану та Q3) у реальному часі на великому наборі даних, не зберігаючи спостереження. Я спершу спробував алгоритм P-квадратів (Jain / Chlamtac), але я його не задовольнив (трохи занадто багато використання процесора і не переконаний у точності принаймні на моєму наборі даних).
Зараз я використовую алгоритм FAME ( Feldman / Shavitt ) для оцінки медіани на ходу і намагаюся вивести алгоритм для обчислення також Q1 і 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
Для відновлення він просто використовує медіану M, отриману на льоту, щоб розділити набір даних надвоє, а потім повторно використовувати один і той же алгоритм як для Q1, так і для Q3.
Це, здається, працює якось, але я не в змозі продемонструвати (я не математик). Це хибно? Буду вдячний за будь-яку пропозицію чи можливу іншу техніку, яка відповідає проблемі.
Велике спасибі за вашу допомогу !
==== EDIT =====
Для тих, хто цікавиться такими питаннями, через кілька тижнів я нарешті закінчився простим використанням відбору проб водойми з ревервором 100 значень, і це дало дуже задовольняючі результати (для мене).