我需要在不存储观测值的情况下,根据大量数据实时计算四分位数(Q1,中位数和Q3)。我首先尝试了P平方算法(Jain / Chlamtac),但对它却不满意(CPU使用量过多,至少对于我的数据集的精度没有把握)。
我现在使用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个值的revervoir的Reservoir Sampling,这给了我非常令人满意的结果。