如何在 scikit 中使用具有半正弦距离的 DistanceMetrix.pairwise()
Posted
技术标签:
【中文标题】如何在 scikit 中使用具有半正弦距离的 DistanceMetrix.pairwise()【英文标题】:How to use DistanceMetrix.pairwise() using haversine distance in scikit 【发布时间】:2019-05-21 18:40:10 【问题描述】:如何使用 sklearn 库中的 hasrsine pairwise 函数获得以公里为单位的距离?查看https://***.com/a/38685263/8378399 的示例,从 scikit-learn 返回的数字不正确,这让我相信我没有正确调用它。
示例代码:
from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371 # Radius of earth in kilometers. Use 3956 for miles
return c * r
from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('haversine')
paris = (48.8566, 2.3522)
lyon = (45.7640, 4.8357)
hdist = haversine(paris[1],paris[0], lyon[1], lyon[0])
skdist = dist.pairwise([paris], [lyon]) * 6371
# Returns: The distance between Paris and Lyon is 391km. sklearn=17766km
"The distance between Paris and Lyon is 0:.3gkm. sklearn=1:.5gkm".format(hdist, skdist[0][0])
【问题讨论】:
【参考方案1】:来自 sklearn 文档:
请注意,haversine 距离度量需要以下形式的数据 [纬度,经度],输入和输出均以 弧度。
所以,在应用函数之前将纬度和经度转换为弧度:
skdist = dist.pairwise(np.radians([paris]), np.radians([lyon])) * 6371
【讨论】:
以上是关于如何在 scikit 中使用具有半正弦距离的 DistanceMetrix.pairwise()的主要内容,如果未能解决你的问题,请参考以下文章