执行离散 voronoi 镶嵌的有效方法
efficient way of performing a discrete voronoi tessellation
假设我在 d 维 space, c_1, c_2, ..., c_N 中有少量点,其中 N 约为 50 -100.
现在,我在 d 维 space 中有一组样本 x_1、x_2、...、x_M,其中 M 可以大到1e7.
是否有一种有效的方法来分离样本 x_1、x_2、...、x_M,以便对于每个 j,我们将 x_j 分配给点 c_k 从 x_j 到 c_k 的欧氏距离(对于所有 k)最小?
到目前为止,我采用的是蛮力方法:对于每个 j,我只计算 x_j 与所有 c_k 的距离。在低维度中,我可以使用 Matlab 中的 repmat 和一些矢量化代码轻松地做到这一点。
但是,在高维度中,我 运行 在执行 repmat 时遇到内存问题,尤其是在 M 非常大的情况下。因此,运行 循环遍历每个 x_j 变得非常慢。由于我必须多次执行此聚类过程,因此我的整个模拟时间超过一天。
关于如何使聚类过程更高效的任何想法?我试着环顾四周,但只发现了与我无关的 k 均值聚类,因为给出了 c_1,...,c_N。
像 k-d 树这样的最近邻结构在高维度(维数灾难)中表现很差。我的第一个建议是分块处理样本,这些样本要大到足以避免 MATLAB 解释器的开销,但又要小到足以轻松放入缓存中。
假设我在 d 维 space, c_1, c_2, ..., c_N 中有少量点,其中 N 约为 50 -100.
现在,我在 d 维 space 中有一组样本 x_1、x_2、...、x_M,其中 M 可以大到1e7.
是否有一种有效的方法来分离样本 x_1、x_2、...、x_M,以便对于每个 j,我们将 x_j 分配给点 c_k 从 x_j 到 c_k 的欧氏距离(对于所有 k)最小?
到目前为止,我采用的是蛮力方法:对于每个 j,我只计算 x_j 与所有 c_k 的距离。在低维度中,我可以使用 Matlab 中的 repmat 和一些矢量化代码轻松地做到这一点。
但是,在高维度中,我 运行 在执行 repmat 时遇到内存问题,尤其是在 M 非常大的情况下。因此,运行 循环遍历每个 x_j 变得非常慢。由于我必须多次执行此聚类过程,因此我的整个模拟时间超过一天。
关于如何使聚类过程更高效的任何想法?我试着环顾四周,但只发现了与我无关的 k 均值聚类,因为给出了 c_1,...,c_N。
像 k-d 树这样的最近邻结构在高维度(维数灾难)中表现很差。我的第一个建议是分块处理样本,这些样本要大到足以避免 MATLAB 解释器的开销,但又要小到足以轻松放入缓存中。