最近邻居搜索和VPTree的性能问题

时间:2018-08-17 17:12:28

标签: python performance interpolation sparse-matrix nearest-neighbor

我已经阅读了此问题解答-knn with big sparse matrices in python,并且遇到了类似的问题。我的雷达数据稀疏数组,大小为125930,经度和纬度具有相同的形状。只有5%的数据不是NULL。其余全为NULL。

数据在球体上可用,因此我使用VPTree和大圆距离来计算距离。网格间距是不规则的,我想将此数据插值到球面上的规则网格中,该球面在纬度和经度方向上的距离为0.05度。在粗网格中,两个纬度之间的间距为0.01,两个经度之间的间距为0.09。因此,我按照以下方式创建了网格网格,并且我具有以下网格点数-基于不规则网格的经度和纬度的最大值,总计为12960000。

latGrid = np.arange(minLat,maxLat,0.05)
lonGrid = np.arange(minLo,maxLo,0.05)


gridLon,gridLat = np.meshgrid(lonGrid,latGrid)
grid_points = np.c_[gridLon.ravel(),gridLat.ravel()]

radar_data = radar_element[np.nonzero(radar_element)]
lat_surface = lat[np.nonzero(radar_element)]
lon_surface = lon[np.nonzero(radar_element)]

points = np.c_[lon_surface,lat_surface]
if points.size > 0:
   tree = vptree.VPTree(points,greatCircleDistance)
    for grid_point in (grid_points):
        indices = tree.get_all_in_range(grid_point,4.3)
        args.append(indices)

问题是查询

get_all_in_range

以上数据的每次通过目前需要12分钟才能运行,我总共有175次通过,总时间为35小时,这是不可接受的。是否有任何方法可以减少网格点的数量(基于由于返回的大部分索引为null,因此发送给查询的一些相似性?我还使用了Scikit-learn的BallTree,其性能甚至比这还差。我不确定FLANN是否适合解决我的问题。

2 个答案:

答案 0 :(得分:1)

我只需要转换为3D坐标并使用欧几里得距离即可。

您可以使用类似Annoy的信息(披露:我是作者)

我构建的示例:https://github.com/erikbern/ping/blob/master/plot.py

答案 1 :(得分:1)

我首先将您的雷达观测值作为纬度/经度放入空间索引中。为了使用Python,让我们使用R-Tree。我会遵循这个概念:

http://toblerity.org/rtree/tutorial.html#using-rtree-as-a-cheapo-spatial-database

加载您的雷达观测结果:

for id, (y, x, m) in enumerate(observations):
    index.insert(id=id, bounds=(x, y, x, y), obj=(y,x,m))

然后根据您想要的大圆距,我将计算一个“安全的”欧几里德距离以滤除候选点。

您可以在R树中查询输出网格点(x,y)附近的候选点:

candidates  =  idx.intersection((x - safe_distance, y - safe_distance, x + safe_distance, y+safe distance), objects=True)]

这将为您提供候选点列表,[(y, x, m),...]

现在使用Great Circle计算过滤候选对象。然后,您可以对其余的点对象进行插值。