如果我在2D空间中有一组 N 点,由它们位置的向量X和Y定义。什么是有效的算法
按点最短的最近邻距离对点进行排序并删除具有最小值的点不会给出正确的答案,因为您删除了两个紧密对的点,而您可能只需要删除其中的一个点对
对于我的情况,我通常会处理1,000-10,000点积分,我可能会删除50-90%的积分。
答案 0 :(得分:1)
诺姆
一种方法是将2D空间分成N个分区。在每个分区内,确定每个X,Y的平均位置。然后在平均点上执行最近邻居algorightm。然后在匹配的分区的完整点集上重复最近邻居测试。
这是一个问题。分区越大,您将获得的点数越少,但准确度越低。分区越小,它就越准确,但处理的点越多。
答案 1 :(得分:1)
您不需要存储(或计算)整个距离矩阵:Delaunay triangulation应该有效(O(n log n)
最差情况下)给您点集的最近邻居。您还应该能够在删除点时有效地更新它。
对于大多数近距离对的情况,如果另一对被移除,您应该能够检查哪一对距其邻居最远。这不是一个确切的解决方案;特别是如果删除大部分点,删除局部最佳点可能会排除全局最优解。此外,您应该能够处理3个或更多本地关闭点的集群。但是,如果您只从随机分布的集合中删除一小部分点,则这两种情况可能相对较少。
可能有或没有更好的方法(即精确有效的算法)来解决您的问题,但上述建议应该导致近似和/或组合方法,当需要删除的点是稀疏分布。
答案 2 :(得分:1)
除了蛮力方法之外我什么也想不到。但是,在进行任何分析之前,您可能会缩短您正在查看的数据集。
所以,我会做的是。首先计算每个点的最近邻距离。我们称之为P_in
。然后算出每个点到M
最近邻居的最大距离,称之为P_iM
。如果P_in
对于任何点都大于P_iM
,则可以从分析中排除它。基本上如果你有一个点与任何其他点的距离为10,并且你有另一个点距离最近的M
点的距离为9,那么你应该删除第一个点。
根据群集的级别或M
的大小,这可能会减少您的数据集。