【问题标题】:python sklearn KDTree with haversine distancepython sklearn KDTree与haversine距离
【发布时间】:2021-06-21 15:36:57
【问题描述】:

我尝试创建 WGS84 坐标的 KD 树并在一定半径内找到邻居

from sklearn.neighbors.dist_metrics import DistanceMetric
from sklearn.neighbors.kd_tree import KDTree    
T = KDTree([[47.8665, 8.90123]], metric=DistanceMetric.get_metric('haversine'))

但是得到以下错误:

ValueError: metric HaversineDistance is not valid for KDTree

如何在 KD-Tree 中使用半正弦距离?

【问题讨论】:

    标签: python scikit-learn kdtree


    【解决方案1】:

    k-d-tree(据我所知)只能与 Minkowski 范数一起使用。

    还有其他树,例如 sklearn 中的球树,或 ELKI 中的覆盖树,因为它是一个度量标准,所以可以使用 Haversine distance。

    【讨论】:

    • 您也可以使用 KDTree,但是您必须将经度、纬度对转换为 carthesian/euclidean 值,并将距离值转换回英里或公里。据我所知,您还可以将经度和纬度转换为弧度,从而直接以公里为单位提供距离。但还没有测试过。
    【解决方案2】:

    KDTree.valid_metrics

    输出 -

    ['p',
     'l1',
     'chebyshev',
     'manhattan',
     'minkowski',
     'cityblock',
     'l2',
     'euclidean',
     'infinity']
    

    这说明,您不能将 haversine 与 KDTree 一起使用。其背后的原因是haversine 距离为您提供Orthodromic 距离,这是在球体中表示您的点时使用的距离度量。但是在 kdTree 中,这些点被组织在一个树中,这使得它无法使用。

    【讨论】:

    • 感谢您的解释。知道如何让它比 O(n^2) 运行得更快(计算所有距离对)吗?
    • 有些树可以与haversine一起使用。但是kd-tree没有。在python中,球树就是一个例子。
    • 哦,我完全没有意识到这一点。谢谢(你的)信息。我会读一下。
    猜你喜欢
    • 2016-08-31
    • 2016-02-17
    • 2023-03-17
    • 2016-04-02
    • 2016-04-06
    • 2017-09-29
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多