减少 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 点的距离矩阵的计算的主要内容,如果未能解决你的问题,请参考以下文章