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 tree 或 ELKI 中的 covertree 可以使用 Haversine 距离,因为它是一个度量。
我尝试创建一棵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 tree 或 ELKI 中的 covertree 可以使用 Haversine 距离,因为它是一个度量。