具有haversine距离的python树

具有haversine距离的python树,python,scikit-learn,kdtree,Python,Scikit Learn,Kdtree,我尝试创建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 Have

我尝试创建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树中使用haversine距离?

KDTree。有效的度量标准

输出-

['p',
 'l1',
 'chebyshev',
 'manhattan',
 'minkowski',
 'cityblock',
 'l2',
 'euclidean',
 'infinity']
这说明,您不能将
haversine
与KDTree一起使用。它背后的原因是哈弗森距离给出了距离,这是在球体中表示点时使用的距离度量。但是在kdTree中,点被组织在树中,这使得使用它无效。

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


还有其他树,如sklearn中的ball树,或ELKI中的covertree树,可以处理Haversine距离,因为它是一个度量。

感谢您的解释。有没有办法让它跑得比O(n^2)(计算所有的距离对)更快?有一些树可以和哈弗森一起工作。但是kd树没有。在python中,球树就是一个例子。哦,我完全没有意识到这一点。谢谢你的信息。我会读到的。你也可以使用KDTree,但是你必须将经度、纬度对转换成carthesian/euclidean值,并将距离值转换回英里或公里。据我所知,你也可以把经度和纬度转换成弧度,它直接以公里为单位给出距离。但我还没有测试过。