我需要在大量数据上实时计算四分位数(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 来结束,它给出了非常令人满意的结果(对我来说)。