Scikit-learn中BallTree的query_radius方法radius参数输入要求咨询
Scikit-learn BallTree query_radius方法radius参数输入规则说明
BallTree.query_radius方法的radius参数取值没有统一的固定换算规则,完全与你初始化BallTree实例时指定的距离度量(metric)保持一致,具体分两种常用场景说明:
地理坐标(经纬度)使用Haversine度量场景
如果初始化BallTree时指定metric='haversine',此时所有距离计算的单位为弧度,radius参数需要传入换算后的弧度值,换算公式为:radius = 待搜索实际物理半径 / 地球半径
- 地球半径常用取值为6371km(匹配公里单位的物理半径)或3956英里(匹配英里单位的物理半径),需与你使用的物理半径单位严格对应
- 注意Haversine度量要求输入的经纬度坐标必须先转换为弧度值,若直接传入度为单位的经纬度,即使radius换算正确也会得到错误结果
常规度量使用场景
如果初始化BallTree时使用欧氏距离、曼哈顿距离等常规度量,radius参数直接传入与输入特征维度匹配的数值即可,无需额外换算。例如输入特征为平面直角坐标系下的米级坐标,要搜索50米范围内的点,直接传入radius=50即可。
常见结果不符合预期的排查点
- 确认初始化BallTree时的metric参数与你预期的距离规则一致
- 确认输入特征的单位/格式与metric要求匹配
- 确认物理半径与地球半径的单位是否匹配
正确使用示例(Haversine场景)
import numpy as np from sklearn.neighbors import BallTree # 输入经纬度(格式为[纬度, 经度])先转换为弧度 coords = np.radians(np.array([ [39.9, 116.3], # 北京 [31.2, 121.4], # 上海 [23.1, 113.2] # 广州 ])) # 初始化BallTree,指定haversine度量 tree = BallTree(coords, metric='haversine') # 搜索北京周边100公里范围内的点,换算为弧度单位 search_radius = 100 / 6371 result_indices = tree.query_radius(np.radians(np.array([[39.9, 116.3]])), r=search_radius)
内容的提问来源于stack exchange,提问作者JoeShmo
相关产品推荐
相关产品推荐

