多変量経験的分布関数(ECDF)を計算するためのアルゴリズム?


9

1次元ECDFの計算はかなり簡単です。ただし、2次元以上になると、オンラインリソースはまばらになり、到達が困難になります。多変量ECDFを計算するための効率的なアルゴリズム(既製の実装ではない)を提案、定義、および/または提示できますか?


これはコンピューターサイエンスの問題かもしれませんが、ここが答えを見つけるのに最適な場所だと思います。他の場所を探すべきかどうか教えてください。ありがとう。
Alexander F.

本当に根本的な違いはありますか?一変量ECDFの計算は、データの並べ替えと同じです。多変量ECDFを計算することは、データを辞書式にソートすることと同じです。
whuber

1
@whuber、正確には、私が知る限りでは。各データポイントについてX(i)、それによって定義されたハイパーキューブに含まれるポイントの数をカウントする必要があります(すべての次元-infまで、およびそれを含むX(i))。辞書式(辞書?)の並べ替えは、データポイントをすべての次元で個別に比較する必要があるため、ここでは必ずしも機能しません。例:(2,3,4)と比較して辞書的には大きくなります(1,2,15)が、で定義されているハイパーキューブ(2,3,4)にはが含まれない(1,2,15)ため15>4です。
Alexander F.

確かに、対応はそれほど直接的ではありません。しかし、努力でポイントquadtree(またはoctree など)を構築するために、その並べ替えまたはそれに似たものを利用し。詳細については、計算ジオメトリと空間インデックスの文献を調べてください。O(nlog(n))
whuber

回答:


7

さらに調査すると、次の論文はkD ECDF問題の効率的なアルゴリズムを示しています。

ベントレー、JL(1980)。多次元の分割統治。ACMの通信、23(4)、214-229。

導入された主なデータ構造は範囲ツリーと呼ばれ、kdツリーに似ていますが、時間とスペースのトレードオフを使用してより高速な範囲クエリを実現します。上記の論文の著者であるJon Bentley(Programming Pearlsの名声)は、両方のデータ構造の発明者です。

どちらも二分木であり、中央値で座標軸に沿って分割することにより、次元の点のセットを再帰的に分割します。kdツリーでは、ノードのサブツリーが番目の次元に沿って分割されます。ここで、は循環してツリーを下っていきます。範囲ツリーでは、サブツリーは常に最初の次元に沿って分割されますが、各ノードは、残りの次元にわたって定義された次元の範囲ツリーで拡張されます。kdd1kk1

この記事の執筆時点で、上記の「範囲ツリー」のWikipediaページは、2012年頃の2つのツリータイプを比較するCS講義(ユトレヒトU)を指しています。これは、これらのデータ構造が依然として本質的に「最新の技術」であることを示唆しています」範囲ツリーの改善された「フラクショナルカスケード」バリアントについての言及がありますが、全点ECDF問題の場合、これにより、範囲ツリーのクエリを繰り返し実行することで、Bentleyのアルゴリズムのパフォーマンスを実現できます。


興味深い論文をありがとう!これが私が必要としていることだと思います:kd trees。別の方法を見て素晴らしいと思います。これが最新のものでない限り。
Alexander F.

@AlexanderF。アルゴリズムをより詳しく説明するために回答を更新しました(より「公式な」参照を含む)。アプローチはまだ最先端技術に近いようです。最近の開発では、さらに調査したい場合、キーフレーズは「直交範囲クエリ」のように見えます。
GeoMatt22

3

データポイントでECDFを計算するより効率的な方法があるかどうかはわかりませんが、次のブルートフォースアプローチは、データ「グリッド」で ECDFを計算するのに効率的です。これは、1Dバージョンの単純な一般化です。

行列で与えられた、次元の点で構成されるデータセットがあるとします。簡単にするために、は完全に一意の番号(つまり、一般的な位置 *)で構成されると仮定します。次の疑似コードでは、アルゴリズムについて私が考えた方法でMatlab表記を使用しますが、興味があればこれを拡張できます。NdN×dXX

最初の計算

[x:,k,I:,k]=sort[X:,k] for、k=1:d

ここで、は座標ごとのランク行列、は座標グリッド軸行列(両方ともサイズ)です。IxN×d

次に、データポイントを暗黙のデータグリッドにラスタライズし、として(正規化された)ヒストグラムを計算し 。P=accumarray[I,1N,N×ones[1,d]]

次に、この "EPDF"を各次元で統合して、ECDFを取得します for。P=cumsum[P,k]k=1:d

ここでは、サンプリングされたECDF です。Pi1,,idxi1,1,xid,d

このアルゴリズムは、並べ替えごとに、合計ごとにかかるため、合計コストは。グリッドECDF自体に要素があるため、これは本質的に最適であるはずです。O[NlogN]O[Nd]O[d(Nd+NlogN)]O[Nd]

(*個別の点の仮定は、代わりに使用し、少しの簿記を行うことで緩和できます。)unique[]sort[]


1
ユークリッド空間でポイントを検索する効率的な方法を提供する四分木とその高次元の一般化について学習することに興味があるかもしれません。それらは漸近的にリソースを使用し。これは、よりもはるかに優れています。O(Nlog(N))O(Nd)d>1
whuber

1
@whuber私はこれらについていくつかのアイデアを持っています(例えばkd trees)。ここに「ベストアンサー」が1つあるかどうかわかりません。通常、このような問題では、抽象的なECDFデータ構造がサポートする必要がある操作(ポイントクエリ、部分空間積分、新しいポイントでの更新など)も指定します。これは、どの実装が最も適しているかを判断するのに役立ちます。
GeoMatt22

1
ECDFでサポートする必要がある操作は明確である必要があると思います。最小の問題は、空間の任意の時点で評価することです。ECDFを動的に構築する場合は、別のアプローチが優れている可能性がありますが、これらの問題は現在の質問の範囲を超えているようです。
whuber

@ GeoMatt22、これは確かにヒストグラムを計算する方法のように見え、近似が「十分」である場合には問題ないかもしれません。しかし、なぜO(N^d)ブルートフォースがに近づくような方法を使用するのかO(d*N^2)。あちこちの例では、今の私はと計算d次元関数ecdfに次のMatlab 1つのライナーを使用してデータ・セットの大き過ぎていないO(d*N)ストレージの複雑さを(C(i)データ点の周波数があるY(i,:)): arrayfun(@(i) sum(C(all(bsxfun(@le,Y, Y(i,:)), 2))), (1:size(Y,1)).');
アレクサンダーF.

1
(+1)効率的なアルゴリズムを提供するためではなく、問題を理解するのに役立つ非効率的なアルゴリズムを明確に説明するため。
Scortchi-モニカを回復
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.