観測値を保存せずに、大量のデータセットでリアルタイムで四分位数(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を使用してデータセットを2つに分割し、Q1とQ3の両方で同じアルゴリズムを再利用します。
これは何とか動作するように見えますが、私は実証することができません(私は数学者ではありません)。ひびきますか?問題に適合する提案や最終的なその他の手法をいただければ幸いです。
手伝ってくれてありがとうございます !
====編集=====
そのような質問に興味のある人のために、数週間後、私は100の値の残響でReservoir Samplingを使用することで最終的に終了し、非常に満足のいく結果が得られました(私にとって)。