Avaliação eficiente da estimativa multidimensional da densidade do kernel

9

Eu tenho visto uma quantidade razoável de literatura sobre como escolher kernels e larguras de banda ao calcular uma estimativa de densidade de kernel, mas atualmente estou interessado em como melhorar o tempo necessário para avaliar o KDE resultante em um número arbitrário de pontos.

No meu caso, estou usando um kernel Gaussiano multidimensional (2D ou 3D) com covariância diagonal (ou seja, cada dimensão é independente). As larguras de banda em cada dimensão podem diferir e são selecionadas usando os vizinhos mais próximos. No entanto, minha pergunta provavelmente se estende a diferentes métodos de seleção de kernels e largura de banda.

Digamos que tenho pontos de dados e desejo avaliar o KDE resultante em pontos de grade. Uma implementação simples envolve a avaliação dos tempos normais de pdf multivariados . Para meus propósitos, e estão na ordem de milhares e a avaliação se tornou o gargalo no meu código.MNMNMN

Não sei se existem melhorias geralmente aceitas nesse método básico. Eu encontrei este artigo, que afirma reduzir a complexidade de para . No entanto, o método não foi implementado em nenhuma biblioteca 'padrão' R ou Python que eu conheço - o que sugere que ele ainda não foi amplamente adotado?O(MN)O(M+N)

Obrigado por todas as dicas que você pode dar.

Gabriel
fonte

Respostas:

12

Vou fornecer uma resposta (incompleta) aqui, caso isso ajude mais alguém.

  1. Existem vários métodos matemáticos recentes para calcular o KDE com mais eficiência. Um deles é a Fast Gauss Transform, publicada em vários estudos, incluindo este . Outra é usar uma abordagem baseada em árvore (KD tree ou ball tree) para descobrir quais fontes contribuem para um determinado ponto da grade. Não está claro se isso foi publicado, mas é implementado no Scikit-learn e com base nos métodos desenvolvidos por Jake Vanderplas .
  2. Se esses métodos forem um pouco complicados, é possível escrever algo um pouco mais básico que realize uma tarefa semelhante. Tentei construir um cubóide em torno de cada ponto da grade, com comprimentos laterais relacionados à largura de banda em cada uma dessas dimensões. Isso não permite um ótimo controle de erros, mas permite acelerar.
  3. Por fim, a computação do KDE é facilmente paralelizável, em vários núcleos da CPU ou em uma GPU. Estou pensando em implementar um KDE no CUDA, mas ainda não o fiz.
Gabriel
fonte
Oh, e eu não quero implorar ... mas se alguém pudesse agradar upvote isso para que eu possa finalmente libertar-se das limitações impostas aos recém-chegados, que seria muito apreciado :)
Gabriel