我正在尝试为多个位置计算最佳纬度经度对。 我有一个包含位置的数据库,对于每个位置,我可能有多个坐标。这些坐标中的大多数似乎与位置相关,因为它们彼此相距5米。 所以我可以通过对它们求平均得出一个新的(最终的)纬度经度对。
然而,有时候我有一个点(有时多于一个)位于几百米之外。
考虑到一组(最多10个)纬度经度点,我想找到并保留那些有意义的点并丢弃那些离他人太远的点。
我应该使用哪种方法/算法?
注意我使用Java。
答案 0 :(得分:1)
最简单的方法可能是:
这在java中实现起来应该非常简单,当然可以O(N)
,N
是你集合中的点数。
您的问题是K-means clustering的特定情况,因为您知道哪些真实数据与哪些样本相对应,而在一般情况下您没有这些知识。如果你想要更多的研究,那么请研究这个问题和各种方法。
答案 1 :(得分:1)
简单方法:
比质心方法好一点,它可能会被聚集在一起的几个远处的点所搞砸。
答案 2 :(得分:0)
您需要问自己几个问题:
如果没有明确的标准,您提出的问题很难回答,但我会尝试查看群集算法。
如果我们会跳过我提到过的问题,我会说它计算量很大,但你可以去
你还需要考虑边界情况,例如1)中提到的问题会给你留下一个随机点 - 我怀疑你对此没问题,所以你需要仔细分析你的域名
答案 3 :(得分:0)
如果您使用的是Java8,则以下代码提供了一个优雅的解决方案。
Collector<Location, ?, Location> centreCollector = new CentreCollector();
Location centre = locations.stream().collect(centreCollector);
centre = locations.stream().filter(centre::furtherThan(NOISE_DISTANCE)).collect(centreCollector);
你要创造两件事。 CentreCollector
类,它实现了收集器,并在将位置对象传输到它们时对其进行平均;以及furtherThan
方法,该方法返回一个Predicate,用于将this
与给定位置之间的距离与给定距离进行比较。
稍微优雅的方法是计算到中心的距离的标准偏差,然后丢弃距平均距离超过一定数量标准偏差的任何位置。这样做的好处是可以考虑所有或大部分样本都超过中心的NOISE_DISTANCE的位置集。在这种情况下,CentreCollector必须返回一个更复杂的对象,该对象保存位置和统计信息,并且furtherThan
作为该类的成员而不是位置。如果您希望我发布使用标准差的等效代码,请在评论中告诉我。