Мне нужно вычислить квартили (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.
Кажется, это работает как-то, но я не могу продемонстрировать (я не математик). Это ущербный? Я был бы признателен за любое предложение или возможную другую технику, подходящую для этой проблемы.
Большое спасибо за Вашу помощь !
==== РЕДАКТИРОВАТЬ =====
Для тех, кто интересуется такими вопросами, через несколько недель я, наконец, закончил, просто используя выборку из резервуара с ревервуаром 100 значений, и это дало очень удовлетворительные результаты (для меня).
Ответы:
Медиана - это точка, в которой 1/2 наблюдения опускаются ниже, а 1/2 выше. Точно так же 25-й перцентиль - это медиана для данных между минимумом и медианой, а 75-й перцентиль - это медиана между медианой и максимумом, так что да, я думаю, что вы на твердой почве, применяя алгоритм медианы, который вы используете сначала весь набор данных, чтобы разделить его, а затем на две результирующие части.
Обновление :
Этот вопрос о переполнении стека приводит к работе: Радж Джейн, Имрих Хламтак: Алгоритм P2 для динамического вычисления квантилей и гистограмм без сохранения наблюдений. Commun. ACM 28 (10): 1076-1085 (1985) , резюме которого указывает, что он, вероятно, представляет для вас большой интерес:
источник
Очень небольшое изменение в методе, который вы опубликовали, и вы можете вычислить любой произвольный процентиль, не вычисляя все квантили. Вот код Python:
и пример:
источник