Algorithm 删除点以最大化最短近邻距离

Algorithm 删除点以最大化最短近邻距离,algorithm,nearest-neighbor,Algorithm,Nearest Neighbor,如果我在二维空间中有一组N个点,由它们位置的向量X和Y定义。什么是有效的算法可以 选择要删除的固定数量(M)点,以便最大化剩余点之间的最短最近邻距离 移除最少数量的点,以便剩余点之间的最短最近邻距离大于固定距离(D) 按点的最短近邻距离排序并删除具有最小值的点并不能给出正确答案,因为这样会删除紧密对的两个点,而可能只需要删除这些对中的一个点 就我的情况而言,我通常要处理1000-10000个积分,我可能会删除50-90%的积分。Noam 一种方法是将2D空间分成N个分区。在每个分区内,确定每个X

如果我在二维空间中有一组N个点,由它们位置的向量X和Y定义。什么是有效的算法可以

  • 选择要删除的固定数量(M)点,以便最大化剩余点之间的最短最近邻距离
  • 移除最少数量的点,以便剩余点之间的最短最近邻距离大于固定距离(D)
  • 按点的最短近邻距离排序并删除具有最小值的点并不能给出正确答案,因为这样会删除紧密对的两个点,而可能只需要删除这些对中的一个点

    就我的情况而言,我通常要处理1000-10000个积分,我可能会删除50-90%的积分。

    Noam

    一种方法是将2D空间分成N个分区。在每个分区内,确定每个X,Y的平均位置。然后对平均点执行最近邻算法。然后对匹配的分区的完整点集重复最近邻测试


    这是陷阱。分区越大,点数越少,但精确度越低。分区越小,越精确,但需要处理的点越多

    您不需要存储(或计算)整个距离矩阵:a应该有效地(
    O(n log n)
    最坏情况)为您提供点集的最近邻居。您还应该能够在删除点时高效地更新它

    对于大多数情况下的近对,您应该能够检查,如果另一对被移除,哪一对距离其邻居最远。这不是一个精确的解决方案;特别是如果删除了大部分点,删除局部最优点可能会排除全局最优解。此外,您应该能够处理由3个或更多本地闭合点组成的集群。但是,如果只是从随机分布的集合中移除一小部分点,则这两种情况可能相对较少


    也许有更好的方法(即精确有效的算法)来解决您的问题,也可能没有更好的方法,但上述建议应该会导致一种近似和/或组合方法,当需要删除的点分布稀疏时,这种方法最有效。

    除了暴力方法,我想不出任何其他方法。但在进行任何分析之前,您可能会大大缩短正在查看的数据集

    所以,我要做的是。首先计算出每个点的最近邻距离。让我们称之为
    P_in
    。然后计算出每个点到其
    M
    最近邻的最大距离,称之为
    P\u iM
    。如果任一点的
    P_in
    大于
    P_iM
    ,则可将其从分析中排除。基本上,如果一个点与任何其他点的距离为10,而另一个点与最近的
    M
    点的距离为9,则应删除第一个点


    根据聚类级别或
    M
    的大小,这可能会大大减少您的数据集。

    一个可能不完美的算法:找到最近的两点,删除下一个NND最小的点,重复,直到达到M或D。另一个,由@berkeleymalagon在twitter上建议:计算所有成对距离一次,按距离对所有对进行排序,并从最少对数的最短对中删除点。我想到,对于案例(2),如果我计算全距离矩阵,每个点都将是数对距离OK的对中的一员,这意味着案例(2)是一个经典案例。但是案例(1)呢?案例(1)给我的印象是一种背包问题,使用的是非整数权重。我会试试这个。然而,在我的情况下,我可能会删除50-90%的分数。我来看看这个方法在这种情况下是如何运作的。