python 具有半正弦距离的 sklearn KDTree

python sklearn KDTree with haversine distance

我尝试创建一棵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 树中使用半正弦距离?

KDTree.valid_metrics

输出 -

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

也就是说,您不能将 haversine 与 KDTree 一起使用。其背后的原因是 haversine 距离给你 Orthodromic 距离,这是当你的点在球体中表示时使用的距离度量。但是在 kdTree 中,点被组织在一棵树中,这使得它无法使用。

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

还有其他树,例如 sklearn 中的 ball tr​​ee 或 ELKI 中的 covertree 可以使用 Haversine 距离,因为它是一个度量。