一部のデータの分位数を推定したい。データは非常に大きいため、メモリに格納できません。また、データは静的ではなく、新しいデータが引き続き送信されます。非常に限られたメモリと計算でこれまでに観測されたデータの分位を監視するアルゴリズムを知っている人はいますか?私が見つけP2アルゴリズムが役に立つが、それは非常に重いテイル分布している私のデータ、のために非常にうまく機能しません。
一部のデータの分位数を推定したい。データは非常に大きいため、メモリに格納できません。また、データは静的ではなく、新しいデータが引き続き送信されます。非常に限られたメモリと計算でこれまでに観測されたデータの分位を監視するアルゴリズムを知っている人はいますか?私が見つけP2アルゴリズムが役に立つが、それは非常に重いテイル分布している私のデータ、のために非常にうまく機能しません。
回答:
P2アルゴリズムは素晴らしい発見です。分位数の推定をいくつか行い、それらを定期的に更新し、2次(線形ではなく、3次ではない)内挿を使用して分位を推定します。著者は、線形補間よりもテールで二次補間がうまく機能し、三次補間はうるさくて難しくなると主張しています。
「重尾」データに対してこのアプローチがどのように失敗するかを正確に述べることはできませんが、推測するのは簡単です。ただし、すべてのデータを保存する場合でも、これは(それほどではないが)問題になるので、奇跡を期待しないでください!
とにかく、補助マーカーを設定しないのはなぜですか?それらをおよびx 6と呼びましょう。その中で、変位値が確実に存在し、x 0とx 6の間にあるすべてのデータを保存しますか?あなたのバッファがいっぱいになると、あなたは常に保ち、これらのマーカーを更新する必要がありますX 0 ≤ X 6。これを行う簡単なアルゴリズムは、(a)変位値の現在のP2推定値と(b)x 0未満のデータ数およびx 6を超えるデータ数の保存されたカウントの組み合わせから考案できます。。このようにして、データセット全体を常に利用できる場合と同様に、高い確実性で、分位数を推定できますが、必要なバッファは比較的小さいだけです。
具体的には、データ構造を提案して、n 個のデータ値x 1、x 2、… 、x nのシーケンスに関する部分的な情報を維持します。ここで、yはリンクリストです
この表記では、は、これまでに読み取られたn x値のうちi 番目に小さい値を示します。 mは定数、バッファyのサイズです。
アルゴリズムは、最初に検出されたm個のデータ値をし、それらを最小から最大のソート順に配置します。してみましょうqが推定される分位も。たとえば、q = 0.99。x n + 1を読み取ると、3つの可能なアクションがあります。
もし、増分K。
もし、何もしません。
そうでなければ、x n + 1をyに挿入し ます。
いずれにしても、インクリメントします。
挿入手順プットへのYソートされた順序で、その後は、極端な値のいずれか排除Y。
もし、次いで除去X (N )[ K + 1 ]からY及び増分K。
そうでなければ、yからを削除します。
提供十分に大きい場合、この手順は、高い確率で分布の真の変位値を一括します。任意の段階でNはの点で通常の方法で推定することができるX (N )[ ⌊ Q N ⌋ ]と X、おそらくにあるであろうY。(私はmがデータの最大量の平方根(N)、私はそれを証明するために厳密な分析を行っていない。)いずれにせよ、このアルゴリズムは、比較することにより(それが成功したか否かを検出すると(K + Mを)/ NをQ)。
m = 2を使用して最大100,000個の値でテスト√及びQ=0.5(最も難しい場合)、このアルゴリズムは、正しい値取得中に99.5%の成功率を有することを示す X(N )[ ⌊ Q N ⌋ ]を。N=10 12値のストリームの場合、必要なバッファはわずか200万です(ただし、300万または400万がより適切な選択です)。ソートされた二重リンクリストをバッファに使用するには、O(log( √=O(log(N))最大または最小の識別および削除中の作業はO(1)操作です。通常、比較的高価な挿入はO( √回。したがって、このアルゴリズムの計算コストはO(N+ √時間およびO( √ストレージ内。
私が考えるwhuberの提案は素晴らしいですし、私はそれが最初にしようとするだろう。ただし、実際にOに対応できない場合は(√ストレージまたは他の何らかの理由でうまくいかない場合、P2の別の一般化のアイデアがあります。これは、whuberが提案するほど詳細ではありません。ソリューションとしてではなく、研究のアイデアのようなものです。
、p / 2、p、(1 + pで変位値を追跡する代わりに元のP2アルゴリズムが示唆するように、)/ 2、および 1で、より多くの変位値を追跡できます(ただし、一定の数)。アルゴリズムが非常に簡単な方法でそれを可能にしているように見えます。必要なのは、着信ポイントの正しい「バケット」を計算し、分位点を更新する正しい方法です(隣接する数値を2次的に使用)。
ポイントを追跡するとします。あなたはにおける分を追跡してみてください可能性が0、P / 12、...、P ⋅ 11 / 12、P、P + (1 - P )/ 12、...、P + 11 ⋅ (1 - P )/ 12、1(ピッキング等間隔の間の点0とPとの間のpそして)、あるいは使用22個の 2 I - 1 )π チェビシェフノード形式の及びP+(1-P)/2⋅(1つの+COS(。pが0または1に近い場合、確率質量が少ない側でより少ないポイントを配置し、反対側でより多くのポイントを配置することができます。
あなたがこれを追求することに決めた場合、私(そしておそらくこのサイトの他の人)はそれが機能するかどうかを知りたいと思うでしょう...
Press et al。、Numerical Recipes 8.5.2 "任意の変位値のシングルパス推定" p。435、区分線形近似cdfを更新するc ++クラスIQAgentを指定します。
これは、オンラインでデータセットの中央値を決定するアルゴリズムから適応させることができます。詳細については、このstackoverflowの記事を参照してください- /programming/1387497/find-median-value-from-a-growing-set
分位回帰を見てみます。これを使用して、見たい分位のパラメトリック推定値を決定できます。それは正規性に関する仮定を行わないため、不均一分散性をかなりうまく処理し、ローリングウィンドウベースで使用できます。これは基本的にL1-Normのペナルティ付き回帰であるため、数値的にはそれほど集中的ではなく、かなり充実したR、SAS、およびSPSSパッケージといくつかのmatlab実装があります。詳細については、メインおよびRパッケージwikiを参照してください。
編集済み:
数学スタック交換のクロスリンクを確認してください:順序統計のローリングウィンドウを使用して変位値を推定するという非常に単純なアイデアを本質的に説明する論文をいくつか公開しました。文字通り、あなたがしなければならないのは、値を最小から最大にソートし、必要な分位を選択し、その分位内の最大値を選択することです。最新の観測が実際の現在の状態をより代表していると思われる場合は、明らかに、より多くの重みを与えることができます。これはおそらく大まかな見積もりを提供しますが、実行するのは非常に簡単であり、量的な重い持ち上げの動きを経験する必要はありません。ちょっとした考え。
オンラインベースで変位値を推定(および追跡)することができます(変位値回帰のパラメーターにも同じことが当てはまります)。要するに、これはチェックロス関数の確率的勾配降下に帰着します。これは、分位点回帰(分位点は切片のみを含むモデルで表されます)を定義します。
Bell Labsの論文「大量追跡のための増分分位推定」(ftp://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/kdd/p516-chen.pdf)を参照してください。
もう1つの重要なアルゴリズムは、M。GreenwaldおよびS. Khanna 2004-変位値サマリーのスペース効率の良いオンライン計算です。