分位を動的に監視するアルゴリズム


24

一部のデータの分位数を推定したい。データは非常に大きいため、メモリに格納できません。また、データは静的ではなく、新しいデータが引き続き送信されます。非常に限られたメモリと計算でこれまでに観測されたデータの分位を監視するアルゴリズムを知っている人はいますか?私が見つけP2アルゴリズムが役に立つが、それは非常に重いテイル分布している私のデータ、のために非常にうまく機能しません。


いくつかのアイデアについては(中央値の推定のコンテキストで)stats.stackexchange.com/q/346/919のスレッドを参照してください。
whuber

3
この質問はされてクロスポスト math.SE.に
枢機

回答:


16

P2アルゴリズムは素晴らしい発見です。分位数の推定をいくつか行い、それらを定期的に更新し、2次(線形ではなく、3次ではない)内挿を使用して分位を推定します。著者は、線形補間よりもテールで二次補間がうまく機能し、三次補間はうるさくて難しくなると主張しています。

「重尾」データに対してこのアプローチがどのように失敗するかを正確に述べることはできませんが、推測するのは簡単です。ただし、すべてのデータを保存する場合でも、これは(それほどではないが)問題になるので、奇跡を期待しないでください!

とにかく、補助マーカーを設定しないのはなぜですか?それらをおよびx 6と呼びましょう。その中で、変位値が確実に存在し、x 0x 6の間にあるすべてのデータを保存しますか?あなたのバッファがいっぱいになると、あなたは常に保ち、これらのマーカーを更新する必要がありますX 0X 6。これを行う簡単なアルゴリズムは、(a)変位値の現在のP2推定値と(b)x 0未満のデータ数およびx 6を超えるデータ数の保存されたカウントの組み合わせから考案できます。x0x6x0x6x0x6x0x6。このようにして、データセット全体を常に利用できる場合と同様に、高い確実性で、分位数を推定できますが、必要なバッファは比較的小さいだけです。

具体的には、データ構造を提案してn 個のデータ値x 1x 2x nのシーケンスに関する部分的な情報を維持します。ここで、yはリンクリストです(k,y,n)nx1,x2,,xny

y=(x[k+1](n)x[k+2](n)x[k+m](n)).

この表記では、は、これまでに読み取られたn x値のうちi 番目に小さい値を示します。 mは定数、バッファyのサイズです。x[i](n)ithn xmy

アルゴリズムは、最初に検出されたm個のデータ値をし、それらを最小から最大のソート順に配置します。してみましょうqが推定される分位も。たとえば、q = 0.99。x n + 1を読み取ると、3つの可能なアクションがあります。ymqqxn+1

  • もし、増分Kxn+1<x[k+1](n)k

  • もし、何もしません。xn+1>x[k+m](n)

  • そうでなければ、x n + 1y挿入し ます。xn+1y

いずれにしても、インクリメントします。n

挿入手順プットへのYソートされた順序で、その後は、極端な値のいずれか排除Yxn+1yy

  • もし、次いで除去X N [ K + 1 ]からY及び増分Kk+m/2<nqx[k+1](n)yk

  • そうでなければ、yからを削除します。x[k+m](n)y

提供十分に大きい場合、この手順は、高い確率で分布の真の変位値を一括します。任意の段階でNはの点で通常の方法で推定することができるX N [ Q N]Xmnx[qn](n)、おそらくにあるであろうY。(私はmがデータの最大量の平方根(Nx[qn](n)ymN)、私はそれを証明するために厳密な分析を行っていない。)いずれにせよ、このアルゴリズムは、比較することにより(それが成功したか否かを検出するK + Mを/ NQ)。k/n(k+m)/nq

m = 2を使用して最大100,000個の値でテスト及びQ=0.5(最も難しい場合)、このアルゴリズムは、正しい値取得中に99.5%の成功率を有することを示す XN [ Q N]をN=10 12値のストリームの場合、必要なバッファはわずか200万です(ただし、300万または400万がより適切な選択です)。ソートされた二重リンクリストをバッファに使用するには、Ologm=2Nq=.5x[qn](n)N=1012=OlogN最大または最小の識別および削除中の作業はO1操作です。通常、比較的高価な挿入はOO(log(N))O(log(N))O(1)回。したがって、このアルゴリズムの計算コストはON+O(N)時間およびOO(N+Nlog(N))=O(N)ストレージ内。O(N)


これは、P2アルゴリズムの拡張作業です。[リンク] sim.sagepub.com/content/49/4/159.abstract。ストレージは、合計10K RAMの小さなセンサーで実行される私のアプリケーションにはまだ大きすぎます。変位推定にのみ最大で数百バイトを使用できます。
-sinoTrinity

@whuber実際、拡張P2を実装し、均一および指数関数などのさまざまな分布から生成されたサンプルでテストします。しかし、分布が不明なアプリケーションのデータに適用すると、収束に失敗し、相対誤差(abs(estimation-actual)/ actual)が最大300%になることがあります。
-sinoTrinity

2
@sino すべてのデータを使用する場合と比較したアルゴリズムの品質は、尾の重さに依存するべきではありません。エラーを測定するより公平な方法は次のとおりです経験的累積分布関数とします。推定のためのQQのパーセンタイル、違いは何であるF Q及びF qは?それが1 / nのオーダーであれば、非常にうまくやっています。言い換えると、P2アルゴリズムがデータに対して返すパーセンタイルは何パーセントですか?Fq^qF(q^)F(q)1/n
whuber

あなたが正しいです。言及したケースのF(qˆ)とF(q)を最大300%の相対誤差で測定しました。qが0.7の場合、qˆはほぼ0.7であり、無視できる誤差になります。ただし、qが0.9の場合、qˆは約0.95のようです。だからこそ、最大300%の大きな誤差があるのです。0.9ではなく0.95なのはなぜでしょうか?ところで、私はここに図を投稿できますか?また、どうやって数式を投稿できますか?
-sinoTrinity

2
@whuber私の実装が拡張P2に準拠していると確信しています。0.8、0.85、0.9、0.95のクォンタイルを同時に推定すると、0.9は0.95またはそれ以上になります。ただし、0.8、0.85、0.9、0.95、および1.0分位が同時に追跡される場合、0.9は0.9に非常に近くなります。
sinoTrinity

5

私が考えるwhuberの提案は素晴らしいですし、私はそれが最初にしようとするだろう。ただし、実際にOに対応できない場合はストレージまたは他の何らかの理由でうまくいかない場合、P2の別の一般化のアイデアがあります。これは、whuberが提案するほど詳細ではありません。ソリューションとしてではなく、研究のアイデアのようなものです。O(N)

p / 2p1 + pで変位を追跡する代わりに0p/2p元のP2アルゴリズムが示唆するように、/ 2、および 1で、より多くの変位値を追跡できます(ただし、一定の数)。アルゴリズムが非常に簡単な方法でそれを可能にしているように見えます。必要なのは、着信ポイントの正しい「バケット」を計算し、分位点を更新する正しい方法です(隣接する数値を2次的に使用)。(1+p)/21

ポイントを追跡するとします。あなたはにおける分を追跡してみてください可能性が0P / 12...P 11 / 12PP + 1 - P / 12...P + 11 1 - P / 121(ピッキング等間隔の間の点0Pとの間のp250p/12p11/12pp+(1p)/12p+11(1p)/1210ppそして)、あるいは使用22個の 2 I - 1 π122 チェビシェフノード形式の及びP+1-P/21つの+COSp/2(1+cos(2i1)π22)p0または1に近い場合、確率質量が少ない側でより少ないポイントを配置し、反対側でより多くのポイントを配置することができます。p+(1p)/2(1+cos(2i1)π22)p01

あなたがこれを追求することに決めた場合、私(そしておそらくこのサイトの他の人)はそれが機能するかどうかを知りたいと思うでしょう...


+1 OPの制約を考えると、これは素晴らしいアイデアだと思います。期待できるのは近似値だけなので、秘trickは、狭い可能性が高く、目的の分位数を含むビンを選択することです。
whuber



2

分位回帰を見てみます。これを使用して、見たい分位のパラメトリック推定値を決定できます。それは正規性に関する仮定を行わないため、不均一分散性をかなりうまく処理し、ローリングウィンドウベースで使用できます。これは基本的にL1-Normのペナルティ付き回帰であるため、数値的にはそれほど集中的ではなく、かなり充実したR、SAS、およびSPSSパッケージといくつかのmatlab実装があります。詳細については、メインおよびRパッケージwikiを参照してください。

編集済み:

数学スタック交換のクロスリンクを確認してください:順序統計のローリングウィンドウを使用して変位値を推定するという非常に単純なアイデアを本質的に説明する論文をいくつか公開しました。文字通り、あなたがしなければならないのは、値を最小から最大にソートし、必要な分位を選択し、その分位内の最大値を選択することです。最新の観測が実際の現在の状態をより代表していると思われる場合は、明らかに、より多くの重みを与えることができます。これはおそらく大まかな見積もりを提供しますが、実行するのは非常に簡単であり、量的な重い持ち上げの動きを経験する必要はありません。ちょっとした考え。


1

オンラインベースで変位値を推定(および追跡)することができます(変位値回帰のパラメーターにも同じことが当てはまります)。要するに、これはチェックロス関数の確率的勾配降下に帰着します。これは、分位点回帰(分位点は切片のみを含むモデルで表されます)を定義します。

Bell Labsの論文「大量追跡のための増分分位推定」(ftp://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/kdd/p516-chen.pdf)を参照してください。


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