Effiziente Auswertung der mehrdimensionalen Kernel-Dichteschätzung

9

Ich habe eine angemessene Menge an Literatur über die Auswahl von Kerneln und Bandbreiten bei der Berechnung einer Kerneldichteschätzung gesehen, bin aber derzeit daran interessiert, wie die Zeit verbessert werden kann, die zur Bewertung des resultierenden KDE an einer beliebigen Anzahl von Punkten erforderlich ist.

In meinem Fall verwende ich einen mehrdimensionalen (2D oder 3D) Gaußschen Kernel mit diagonaler Kovarianz (dh jede Dimension ist unabhängig). Die Bandbreiten in jeder Dimension können unterschiedlich sein und werden unter Verwendung der nächsten Nachbarn ausgewählt. Meine Frage erstreckt sich jedoch wahrscheinlich auf verschiedene Kernel und Bandbreitenauswahlmethoden.

Angenommen, ich habe Datenpunkte und möchte die resultierende KDE an Gitterpunkten auswerten . Eine einfache Implementierung beinhaltet die Auswertung der multivariaten normalen PDF- Zeiten. Für meine Zwecke liegen und beide in der Größenordnung von Tausenden, und die Bewertung ist zum Engpass in meinem Code geworden.N M N M N.MNMNMN

Mir ist nicht bekannt, ob es allgemein akzeptierte Verbesserungen dieser grundlegenden Methode gibt. Ich habe dieses Papier gefunden, das behauptet, die Komplexität von auf zu reduzieren . Die Methode wurde jedoch in keiner mir bekannten 'Standard'-R- oder Python-Bibliothek implementiert - was darauf hindeutet, dass sie noch nicht weit verbreitet ist?O ( M + N )O(MN)O(M+N)

Vielen Dank für alle Hinweise, die Sie geben können.

Gabriel
quelle

Antworten:

12

Ich werde hier eine (unvollständige) Antwort geben, falls es jemand anderem hilft.

  1. Es gibt mehrere neuere mathematische Methoden, um die KDE effizienter zu berechnen. Eine davon ist die Fast Gauss Transform, die in mehreren Studien veröffentlicht wurde, darunter diese . Eine andere Möglichkeit besteht darin, mithilfe eines baumbasierten Ansatzes (KD-Baum oder Kugelbaum) herauszufinden, welche Quellen zu einem bestimmten Gitterpunkt beitragen. Unklar, ob dies veröffentlicht wurde, aber es ist in Scikit-learn implementiert und basiert auf von Jake Vanderplas entwickelten Methoden .
  2. Wenn diese Methoden etwas umständlich sind, ist es möglich, etwas Grundlegenderes zu schreiben, das eine ähnliche Aufgabe erfüllt. Ich habe versucht, um jeden Gitterpunkt einen Quader mit Seitenlängen zu konstruieren, die sich auf die Bandbreite in jeder dieser Dimensionen beziehen. Dies ermöglicht keine gute Kontrolle über Fehler, beschleunigt jedoch die Geschwindigkeit.
  3. Schließlich ist die Berechnung des KDE recht einfach parallelisierbar, entweder auf mehreren CPU-Kernen oder auf einer GPU. Ich denke darüber nach, eine KDE in CUDA zu implementieren, habe dies aber noch nicht getan.
Gabriel
quelle
Oh, und ich will nicht betteln ... aber wenn jemand dies bitte positiv bewerten könnte , damit ich mich endlich von den Beschränkungen befreien kann, die Neulingen auferlegt wurden, wäre das sehr dankbar :)
Gabriel