如何在 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()的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 中查询半正弦公式

在循环中创建多个循环的数据框以进行半正弦地理定位

使用半正弦地理定位创建两个循环的数据框

Laravel 半正弦计算

快速半正弦逼近(Python/Pandas)

AngularJS获取多个坐标之间的距离