减少 nxn 点的距离矩阵的计算

Posted

技术标签:

【中文标题】减少 nxn 点的距离矩阵的计算【英文标题】:Reducing computation for distance matrix for nxn points 【发布时间】:2017-11-08 12:21:05 【问题描述】:

我有一个带有纬度和经度点的数据框(大约 1m)。

我想计算每个点相对于所有其他点的半正弦距离。

示例:

import haversine

lat1 = 40.5; lat2 = 42; long1 = -90; long2 = -93
print( haversine.distance((lat1, long1), (lat2, long2)) )

但是计算 1mx1m 的计算没有意义,对于每个循环,我们需要比以前少 1 次计算,例如点 1 到 2 的距离将与点 2 到 1 的距离相同。

如何减少每一步的计算量?

【问题讨论】:

【参考方案1】:

使用矢量化方法:

演示:

In [105]: from sklearn.neighbors import DistanceMetric

In [106]: dist = DistanceMetric.get_metric('haversine')

In [107]: df
Out[107]:
    latitude   longitude
0  38.550420 -121.391416
1  38.473501 -121.490186
2  38.657846 -121.462101
3  38.506774 -121.426951
4  38.637448 -121.384613

In [108]: earth_radius = 6371
     ...: D = dist.pairwise(np.radians(df), np.radians(df)) * earth_radius
     ...:

In [109]: D
Out[109]:
array([[  0.        ,  12.12461135,  13.43188915,   5.75400608,   9.69511663],
       [ 12.12461135,   0.        ,  20.64315089,   6.63158885,  20.41101851],
       [ 13.43188915,  20.64315089,   0.        ,  17.07403265,   7.10128697],
       [  5.75400608,   6.63158885,  17.07403265,   0.        ,  14.9892082 ],
       [  9.69511663,  20.41101851,   7.10128697,  14.9892082 ,   0.        ]])

【讨论】:

以上是关于减少 nxn 点的距离矩阵的计算的主要内容,如果未能解决你的问题,请参考以下文章

如何在C中找出NXN矩阵的逆矩阵

两个坐标列表的欧几里得距离矩阵

谷歌距离矩阵与方向 API

从 Rpy2 将距离矩阵馈送到 R 聚类

这个矩阵计算可以在没有中间 3D 矩阵的情况下实现或近似吗?

矩阵优化中的所有最小值