Eindimensionales ECDF ist ziemlich einfach zu berechnen. Wenn es um zwei Dimensionen und mehr geht, werden Online-Ressourcen jedoch spärlich und schwer zu erreichen. Kann jemand effiziente Algorithmen (nicht vorgefertigte Implementierung) für die Berechnung multivariater ECDF vorschlagen, definieren und / oder präsentieren?
ecdf
multivariate-distribution
Alexander F.
quelle
quelle
X(i)
müssen wir die Anzahl der Punkte zählen, die in dem von ihm definierten Hypercube enthalten sind (von-inf
bis einschließlichX(i)
in allen Dimensionen). Die lexikografische Sortierung (Wörterbuch?) Funktioniert hier nicht unbedingt, da die Datenpunkte in jeder Dimension separat verglichen werden müssen. ZB:(2,3,4)
wird im Vergleich zu lexikographisch größer sein(1,2,15)
, aber der durch definierte Hypercube(2,3,4)
wird(1,2,15)
seitdem nicht mehr enthalten15>4
.Antworten:
Bei weiteren Untersuchungen gibt das folgende Papier effiziente Algorithmen für das kD-ECDF-Problem an:
Bentley, JL (1980). Mehrdimensionales Teilen und Erobern. Mitteilungen der ACM, 23 (4), 214-229.
Die eingeführte Hauptdatenstruktur ist als Bereichsbaum bekannt und ähnelt einem kd-Baum , verwendet jedoch einen Kompromiss zwischen Raum und Zeit, um schnellere Bereichsabfragen zu erzielen. Der Autor des obigen Papiers, Jon Bentley (bekannt als Programming Pearls), ist der Erfinder beider Datenstrukturen.
Beide sind Binärbäume, die eine Menge von dimensionalen Punkten rekursiv aufteilen, indem sie entlang einer Koordinatenachse am Median teilen. In einem kd-Baum werden die Unterbäume eines Knotens entlang der ten Dimension aufgeteilt, wobei durch läuft, die sich den Baum hinunter bewegen. In einem Bereichsbaum werden die Unterbäume immer entlang der ersten Dimension aufgeteilt, aber jeder Knoten wird durch einen dimensionalen Bereichsbaum erweitert, der über die verbleibenden Dimensionen definiert ist.k d d 1…k k−1
Zum Zeitpunkt dieses Schreibens verweist die oben verlinkte Wikipedia-Seite für "Range Tree" auf eine CS-Vorlesung (Utrecht U.), in der diese beiden Baumtypen aus dem Jahr 2012 verglichen werden. Dies legt nahe, dass diese Datenstrukturen immer noch im Wesentlichen "Stand der Technik" sind ". Es wird eine verbesserte "fraktionierte Kaskadierungs" -Variante für Bereichsbäume erwähnt, aber für das Allpunkt-ECDF-Problem ermöglicht dies nur, dass die Leistung des Bentley-Algorithmus durch wiederholte Abfragen des Bereichsbaums erreicht wird.
quelle
Ich bin nicht sicher, ob es eine effizientere Methode zur Berechnung des ECDF an den Datenpunkten gibt , aber der folgende Brute-Force-Ansatz sollte für die Berechnung des ECDF über das Daten- "Raster" effizient sein . Es ist eine einfache Verallgemeinerung der 1D-Version.
Angenommen, Sie haben einen Datensatz, der aus Punkten in Dimensionen besteht und in der Matrix . Der Einfachheit halber gehe ich davon aus, dass vollständig aus eindeutigen Zahlen besteht (dh allgemeine Position *). Ich werde die Matlab- Notation im folgenden Pseudocode verwenden, wie ich es mir für den Algorithmus vorgestellt habe, aber ich kann dies bei Interesse erweitern.N d N×d X X
Zuerst berechnen
Dabei ist die koordinatenweise Rangmatrix und die Koordinatengitterachsenmatrix (beide mit der Größe ).I x N×d
Dann rastern die Datenpunkte in den implizierten Datenraster, Berechnen eines (normalisiert) Histogramm als .P=accumarray[I,1N,N×ones[1,d]]
Integrieren Sie dann dieses "EPDF" in jede Dimension, um das ECDF zu erhalten: für .P=cumsum[P,k] k=1:d
Jetzt ist die ECDF, die bei .Pi1,…,id xi1,1,…xid,d
Dieser Algorithmus benötigt Zeit für jede Sortierung und für jede Summe, sodass die Gesamtkosten . Da das gerasterte ECDF selbst -Elemente enthält, sollte dies im Wesentlichen optimal sein.O[NlogN] O[Nd] O[d(Nd+NlogN)] O[Nd]
(* Die Annahme bestimmter Punkte kann gelockert werden, indem anstelle von zusammen mit ein wenig Buchhaltung verwendet wird.)unique[] sort[]
quelle
O(N^d)
wenn der Brute - Force - AnsatzO(d*N^2)
. Zum Beispiel habe ich momentan keinen zu großen Datensatz, daher verwende ich den folgenden Matlab-Einzeiler, um d-dimensionales ECDF mitO(d*N)
Speicherkomplexität zu berechnen (C(i)
ist die Häufigkeit des DatenpunktsY(i,:)
):arrayfun(@(i) sum(C(all(bsxfun(@le,Y, Y(i,:)), 2))), (1:size(Y,1)).');