多维核密度估计的有效评估

机器算法验证 内核平滑
2022-02-28 13:09:21

在计算内核密度估计时,我已经看到了大量关于如何选择内核和带宽的文献,但我目前对如何缩短在任意数量的点上评估生成的 KDE 所花费的时间感兴趣。

就我而言,我使用的是具有对角协方差的多维(2D 或 3D)高斯核(即每个维度都是独立的)。每个维度的带宽可能不同,并使用最近的邻居进行选择。但是,我的问题可能延伸到不同的内核和带宽选择方法。

假设我有M数据点,并希望在N网格点。一个简单的实现涉及评估多元正态 pdfMN次。为了我的目的,MN两者都在数千个数量级,并且评估已成为我代码中的瓶颈。

我不知道这种基本方法是否有任何普遍接受的改进。我找到了这篇论文,它声称可以降低复杂性O(MN)O(M+N). 但是,该方法尚未在我所知道的任何“标准”R 或 Python 库中实现——这表明它尚未被广泛采用?

感谢您提供的任何指示。

1个回答

我将在这里提供一个(不完整的)答案,以防它帮助其他人。

  1. 最近有几种数学方法可以更有效地计算 KDE。一个是快速高斯变换,发表在包括这一项在内的几项研究中。另一种是使用基于树的方法(KD 树或球树)来计算出哪些源对给定的网格点有贡献。不清楚这是否已经发布,但它是在 Scikit-learn 中实现的,并且基于Jake Vanderplas开发的方法。
  2. 如果这些方法有点繁琐,则可以编写一些更基本的东西来完成类似的任务。我尝试在每个网格点周围构建一个长方体,边长与每个维度的带宽相关。这不允许对错误进行很好的控制,尽管它确实可以加快速度。
  3. 最后,计算 KDE 非常容易并行化,无论是在多个 CPU 内核上还是在 GPU 上。我正在考虑在 CUDA 中实现 KDE,但还没有这样做。