优化Scipy的最近邻搜索

6

我正在尝试找到所有距离1公里半径内的最近邻居。以下是我的脚本构建树和搜索最近点的方法:

from pysal.cg.kdtree import KDTree

def construct_tree(s):
    data_geopoints = [tuple(x) for x in s[['longitude','latitude']].to_records(index=False)]
    tree = KDTree(data_geopoints, distance_metric='Arc', radius=pysal.cg.RADIUS_EARTH_KM)
    return tree

def get_neighbors(s,tree):
    indices = tree.query_ball_point(s, 1)
    return indices

#Constructing the tree for search
tree = construct_tree(data)

#Finding the nearest neighbours within 1KM
data['neighborhood'] = data['lat_long'].apply(lambda row: get_neighbors(row,tree))

根据我在pysal页面阅读到的内容,它说 -

在scipy的kd-tree功能之上构建了kd-tree。 如果使用scipy 0.12或更高版本,则使用scipy.spatial.cKDTree,否则使用scipy.spatial.KDTree。

在我的情况下,应该使用cKDTree。 对于示例数据集,这很好地工作,但由于tree.query_ball_point将索引列表作为结果返回。每个列表将有数百个元素。对于我的数据点(200万条记录),这越来越大,并且在某些点上由于内存问题而停止。如何解决呢?


你有没有考虑过不将“邻域”数据存储在DataFrame中?networkx.Graph可能是一个好的选择。 - hilberts_drinking_problem
抱歉,我从未听说过这个。你能写一个例子吗?我可以尝试一下。 - ds_user
https://networkx.github.io/ 是一个用于处理图形数据的库。对于您的情况,我建议将位置 ID 存储为顶点,并在距离小于1公里的位置之间添加边缘。文档包括一个很好的教程。 - hilberts_drinking_problem
请返回已查询的球树。 - Charles
它有什么不同之处? - ds_user
1个回答

0

如果有人在寻找这个问题的答案,我已经通过查找一组最近邻居(tree.query_ball_point可以处理批处理)并将其写入数据库,然后处理下一组,而不是将所有内容保存在内存中来解决它。谢谢。


你说过 "tree.query_ball_point 可以处理批量数据"。你能发一些示例代码吗? - ximiki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接