10 votos

Evaluación eficiente de la estimación multidimensional de la densidad del kernel.

He visto una cantidad razonable de la literatura acerca de cómo elegir los núcleos y anchos de banda cuando el cálculo de una estimación de densidad de kernel, pero actualmente estoy interesado en cómo mejorar el tiempo que se necesita para evaluar el resultado de KDE en un número arbitrario de puntos.

En mi caso, estoy utilizando un multidimensionales (2D o 3D) núcleo Gaussiano con diagonal de la covarianza (es decir, cada dimensión es independiente). Los anchos de banda en cada una de las dimensiones pueden variar y son seleccionadas usando vecinos más próximos. Sin embargo, mi pregunta probablemente se extiende a diferentes kernels y el ancho de banda de los métodos de selección.

Digamos que tengo $M$ puntos de datos y desea evaluar la resultante de KDE en $N$ puntos de cuadrícula. Una implementación simple consiste en la evaluación de la normal multivariante pdf $MN$ veces. Para mis propósitos, $M$ e $N$ están en el orden de los miles, y la evaluación se ha convertido en el cuello de botella en mi código.

Yo no soy consciente de si existen generalmente aceptados, las mejoras de este método básico. He encontrado este documento, que pretende reducir la complejidad de $O(MN)$ a $O(M+N)$. Sin embargo, el método no ha sido implementado en cualquier 'estándar' R o librerías de Python, que yo sepa - lo que sugiere que aún no ha sido ampliamente adoptado?

Gracias por los punteros que puede dar.

13voto

Gabriel Puntos 186

Me voy a dar una (incompleta) responder aquí, en caso de que ayuda a nadie fuera.

  1. Hay varios métodos matemáticos para calcular el KDE de forma más eficiente. Uno es el Ayuno de Gauss Transformar, publicado en varios estudios, incluyendo este. Otro es el uso de un árbol de enfoque basado en (KD árbol o de la bola de árbol) para averiguar qué fuentes de contribuir a un punto de la rejilla. Claro si esta ha sido publicado, pero se implementa en Scikit-learn y con base en los métodos desarrollados por Jake Vanderplas.
  2. Si estos métodos son un poco complicados, es posible escribir algo un poco más básico que logra una tarea similar. Traté de construir un rectángulo alrededor de cada punto de la cuadrícula, con longitudes de lado relacionados con el ancho de banda en cada una de esas dimensiones. Esto no permite un gran control de errores, aunque da algo de velocidad.
  3. Finalmente, el cálculo de KDE es bastante fácil de parallelisable, ya sea en múltiples núcleos de CPU o en una GPU. Estoy pensando en implementar una KDE en CUDA, pero no lo ha hecho todavía.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X