観測値を保存しない四分位数のオンライン推定


13

観測値を保存せずに、大量のデータセットでリアルタイムで四分位数(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を使用することで最終的に終了し、非常に満足のいく結果が得られました(私にとって)。


リンクしたスライドのマルコフ連鎖分析と同様に、例の数が増えるにつれて、Q1とQ2が真の分位数に収束するという証拠を探していますか?実装に関しては、上記のアルゴリズムに欠陥はないようです(Rの標準正規の近似値をテストしましたが、アルゴリズムは正常に機能します)。
Theja

1
@Theja、ありがとう、私は証拠(あまりにも多くの仕事)を探しているのではなく、単にアドバイスとコメントを探しています、私が見る主な問題は、whuberが指摘したように、中央値の実行推定に基づいていることです
ルイユグエス

回答:


3

中央値は、観測値の1/2が下に、1/2が上になる点です。同様に、25パーセンタイルは、最小値と中央値の間のデータの中央値であり、75パーセンタイルは中央値と最大値の間の中央値です。データセット全体を分割してから、結果の2つの部分に分割します。

更新

stackoverflowに関するこの質問は、この論文につながります。RajJain、Imrich Chlamtac:観測値を保存せずに分位数とヒストグラムを動的に計算するためのP²アルゴリズム。コミュニケーション。ACM 28(10):1076-1085(1985)その要約は、おそらくあなたにとって非常に興味深いことを示しています。

中央値および他の分位数の動的計算のための発見的アルゴリズムが提案されています。推定値は、観測値が生成されると動的に生成されます。観測は保存されません。したがって、アルゴリズムには、観測の数に関係なく、非常に小さく固定されたストレージ要件があります。これにより、産業用コントローラーやレコーダーで使用できる分位チップに実装するのに最適です。このアルゴリズムは、ヒストグラムプロットにさらに拡張されています。アルゴリズムの精度が分析されます。


4
この返信では、2つの微妙な点を見落としています。1つは重要ではありませんが、もう1つは非常に重要です。重要ではないのは、二重分割手法が、サンプルサイズに応じて中央値とわずかに異なる上下ヒンジを計算することです。重要なことは、二重分割が中央値の現在の推定に基づいているように見えることです。この推定値と実際の中​​央値との間に変動があると、ヒンジも変動します。直感的には、これはデータ量が増えても問題になりませんが、何らかの分析が必要な問題です。
whuber

n132211n

2
@Avraham、論文を指摘してくれてありがとう、私がすでに述べたように、私はすでにChainとChlamtacのP-squareアルゴリズムを試しました。私のデータセットでは、説明したアルゴリズムがより良い結果(MSE)を提供し、高速です。ですから、それでも問題があるのではないかと疑問に思っていました。whuberが、実行中の推定値を使用するという事実は潜在的な問題であると述べたように、しかし、本当に重要かどうかはわかりません。
ルイ・ユーグ

おっと、それを見て忘れてしまった。謝罪いたします。
アヴラハム

0

投稿したメソッドに非常にわずかな変更が加えられ、すべての分位を計算することなく、任意のパーセンタイルを計算できます。Pythonコードは次のとおりです。

class RunningPercentile:
    def __init__(self, percentile=0.5, step=0.1):
        self.step = step
        self.step_up = 1.0 - percentile
        self.step_down = percentile
        self.x = None

    def push(self, observation):
        if self.x is None:
            self.x = observation
            return

        if self.x > observation:
            self.x -= self.step * self.step_up
        elif self.x < observation:
            self.x += self.step * self.step_down
        if abs(observation - self.x) < self.step:
            self.step /= 2.0

と例:

import numpy as np
import matplotlib.pyplot as plt

distribution = np.random.normal
running_percentile = RunningPercentile(0.841)
observations = []
for _ in range(1000000):
    observation = distribution()
    running_percentile.push(observation)
    observations.append(observation)

plt.figure(figsize=(10, 3))
plt.hist(observations, bins=100)
plt.axvline(running_percentile.x, c='k')
plt.show()

1 STDパーセンタイルの正規分布

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.