Évaluation efficace de l'estimation multidimensionnelle de la densité du noyau

9

J'ai vu une quantité raisonnable de documentation sur la façon de choisir les noyaux et les bandes passantes lors du calcul d'une estimation de la densité du noyau, mais je suis actuellement intéressé par la façon d'améliorer le temps nécessaire pour évaluer le KDE résultant à un nombre arbitraire de points.

Dans mon cas, j'utilise un noyau gaussien multidimensionnel (2D ou 3D) avec une covariance diagonale (c'est-à-dire que chaque dimension est indépendante). Les largeurs de bande dans chaque dimension peuvent différer et sont sélectionnées en utilisant les voisins les plus proches. Cependant, ma question s'étend probablement à différents noyaux et méthodes de sélection de bande passante.

Disons que j'ai M points de données et souhaitent évaluer le KDE résultant à Npoints de grille. Une implémentation simple consiste à évaluer le pdf normal multivariéMNfois. Pour mes fins,M et N sont à la fois de l'ordre de milliers, et l'évaluation est devenue le goulot d'étranglement dans mon code.

Je ne sais pas s'il existe des améliorations généralement acceptées à cette méthode de base. J'ai trouvé ce document, qui prétend réduire la complexité deO(MN) à O(M+N). Cependant, la méthode n'a été implémentée dans aucune bibliothèque R ou Python «standard» que je connaisse - ce qui suggère qu'elle n'a pas encore été largement adoptée?

Merci pour tous les conseils que vous pouvez donner.

Gabriel
la source

Réponses:

12

Je vais fournir une réponse (incomplète) ici au cas où cela aiderait quelqu'un d'autre.

  1. Il existe plusieurs méthodes mathématiques récentes pour calculer plus efficacement le KDE. L'une est la Fast Gauss Transform, publiée dans plusieurs études dont celle-ci . Une autre consiste à utiliser une approche arborescente (arbre KD ou arbre à billes) pour déterminer quelles sources contribuent à un point de grille donné. On ne sait pas si cela a été publié, mais il est implémenté dans Scikit-learn et basé sur des méthodes développées par Jake Vanderplas .
  2. Si ces méthodes sont un peu compliquées, il est possible d'écrire quelque chose d'un peu plus basique qui réalise une tâche similaire. J'ai essayé de construire un cuboïde autour de chaque point de grille, avec des longueurs latérales liées à la bande passante dans chacune de ces dimensions. Cela ne permet pas un grand contrôle des erreurs, mais cela vous donne une certaine vitesse.
  3. Enfin, le calcul de KDE est assez facilement parallélisable, soit sur plusieurs cœurs de processeur, soit sur un GPU. J'envisage d'implémenter un KDE dans CUDA, mais je ne l'ai pas encore fait.
Gabriel
la source
Oh, et je ne veux pas mendier ... mais si quelqu'un pouvait s'il vous plaît voter pour que je puisse enfin me libérer des limitations imposées aux nouveaux arrivants, ce serait très apprécié :)
Gabriel