【问题标题】:Interpreting sklearn haversine outputs to kilometers将 sklearn hasrsine 输出解释为公里
【发布时间】:2019-11-13 16:20:21
【问题描述】:

我不知道如何解释 sklearn(20.2 版)中的 hasrsine 实现的输出

文档说,“请注意,haversine 距离度量需要 [纬度,经度] 形式的数据,输入和输出都以弧度为单位。”,所以我应该能够转换为 km 乘以 6371 (大距离大约为半径)。

两点的有效距离计算如下:

def distance(origin, destination):
    lat1, lon1 = origin
    lat2, lon2 = destination
    radius = 6371 # km

    dlat = math.radians(lat2-lat1)
    dlon = math.radians(lon2-lon1)
    a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
        * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    d = radius * c

    return d

distance([32.027240,-81.093190],[41.981876,-87.969982])
1263.103504537151

这是正确的距离。

使用 BallTree 实现:

from sklearn.neighbors import BallTree
test_points = [[32.027240,41.981876],[-81.093190,-87.969982]]
tree = BallTree(test_points,metric = 'haversine')
results = tree.query_radius(test_points,r = 10,return_distance  = True)

results[1]
array([array([0.        , 1.53274271]), array([1.53274271, 0.        ])],
      dtype=object)

对于 distanceMetric 实现也是如此:

dist = DistanceMetric.get_metric('haversine')
dist.pairwise([[32.027240,41.981876],[-81.093190,-87.969982]])
array([[0.        , 1.53274271],
       [1.53274271, 0.        ]])

我还尝试更改顺序,以防它不应该输入为 [[lat1,lat2],[lon1,lon2]] 并且也没有得到我可以解释的结果。

有谁知道我如何使用 sklearn 实现从两个坐标获取以公里为单位的距离?

【问题讨论】:

    标签: python scikit-learn haversine


    【解决方案1】:

    所以问题是 sklearn 要求所有内容都以 弧度 为单位,但我所拥有的纬度/经度和半径分别以度/米为单位。在使用之前,我需要做一些转换:

    from sklearn.neighbors import BallTree
    earth_radius = 6371000 # meters in earth
    test_radius = 10 # meters
    
    test_points = [[32.027240,41.981876],[-81.093190,-87.969982]]
    test_points_rad = [[x[0] * np.pi / 180, x[1] * np.pi / 180] for x in test_points ]
    
    tree = BallTree(test_points_rad, metric = 'haversine')
    results = tree.query_radius(test_points, r=test_radius/earth_radius, return_distance  = True)
    

    【讨论】:

    • 澄清一下:最终结果是以米为单位的距离,因为您以米为单位定义了 earth_radius,对吧?
    • 正确 - 弧度在技术上只是一个角度,因此无论您定义从地球中心到外部的距离,测量值都将在其中
    • 查询函数的输入也应该以弧度为单位。返回的距离应该乘以地球半径,以米为单位。
    【解决方案2】:

    只是为了澄清@flyingmeatball 之前的回答,有几件事:

    1. 可能是由于 sklearn 的变化:您需要逐行指定坐标
    2. 转换为弧度的简单方法是从数学中导入弧度模块
    3. 最后得到的结果需要再次乘以地球的半径才能得到以米/公里为单位的答案。

    请看下面的代码示例...

    from math import radians
    earth_radius = 6371000 # meters in earth
    test_radius = 1300000 # meters
    
    test_points = [[32.027240,-81.093190],[41.981876,-87.969982]]
    test_points_rad = np.array([[radians(x[0]), radians(x[1])] for x in test_points ])
    
    tree = BallTree(test_points_rad, metric = 'haversine')
    ind,results = tree.query_radius(test_points_rad, r=test_radius/earth_radius, 
    return_distance  = True)
    print(ind)
    print(results * earth_radius/1000)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 2019-07-15
      • 2011-09-11
      • 2017-07-24
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多