高效测地最近的邻居

时间:2018-06-20 18:05:02

标签: python scipy scikit-learn geospatial

从纬度/经度数据(以弧度为单位)开始,我试图有效地找到最接近的n个邻居,最好是测地线(WGS-84)的距离。

现在,我正在使用sklearn’s BallTree并具有正弦距离(KD-Tres仅采用minkowskian距离),它既好又快(3-4秒,可以在7500个可能的匹配中找到1200个位置的最近5个邻居) ,但没有我需要的准确。代码:

tree = BallTree(possible_matches[['x', 'y']], leaf_size=2, metric='haversine')
distances, indices = tree.query(locations[['x', 'y']], k=5)

当我用自定义函数代替度量标准(metric=lambda u, v: geopy.distance.geodesic(u, v).miles)时,将花费“不合理的”长时间(在上述情况下为4分钟)。据记载,自定义功能可能会花费很长时间,但并不能帮助我解决问题。

我看过使用具有ECEF坐标和欧几里得距离的KD树,但是我不确定这是否更准确。

如何保持当前方法的速度,但提高距离精度?

1 个答案:

答案 0 :(得分:2)

指标缓慢的主要原因是它是用Python编写的,而sklearn中的其他指标是用Cython / C ++ / C编写的。

例如,对于here讨论的Random Forests或here,您将必须在Cython中实现指标,派生自己的BallTree版本,并在其中包含自定义指标。 / p>