You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sklearn KDTree如何基于阈值返回最近邻(Python)

嘿,刚好对这个场景很熟悉!你现在用的kd_tree.query()只能指定返回固定数量的近邻,但Sklearn的KDTree其实提供了专门的query_radius()方法,完美匹配你“按距离阈值返回所有符合条件的近邻”的需求。

接下来给你具体的实现步骤和代码示例:

  • 核心方法替换:把原来的query()换成query_radius(),这个方法的核心参数是r(就是你要设定的距离阈值),而不是指定返回数量。
  • 可选参数优化:
    • return_distance=True:会同时返回符合条件的样本索引和对应的距离值,方便你后续分析相似度;如果不需要距离,设为False即可。
    • sort_results=True:可以把结果按距离从小到大排序,这样最相似的图像会排在最前面,非常适合图像检索的场景。

具体代码示例如下:

# 先设定你的距离阈值,比如根据BOVW特征的分布,设定为0.6(你可以根据实际情况调整)
distance_threshold = 0.6

# 执行半径查询,获取所有距离小于阈值的近邻
# 注意:如果是单张查询图像,query_BOVW是一维数组,返回的indices和distances是嵌套数组,取[0]即可
indices, distances = kd_tree.query_radius(
    query_BOVW, 
    r=distance_threshold, 
    return_distance=True, 
    sort_results=True
)

# 提取单张查询对应的结果
similar_image_indices = indices[0]
similar_image_distances = distances[0]

# 之后你就可以用这些索引从训练数据集里取出对应的相似图像了
# 比如假设你的训练图像存在列表training_images里
similar_images = [training_images[idx] for idx in similar_image_indices]

补充几个小细节:

  • 如果你的query_BOVW是批量的(比如多张查询图像),直接传入二维数组就行,返回的indices和distances会分别对应每一张查询的结果。
  • 距离的计算方式和你构建KDTree时用的度量一致(默认是欧氏距离),如果构建时指定了其他度量(比如曼哈顿距离),query_radius()会自动沿用。

这样就能精准地返回所有符合你设定的距离阈值的相似图像啦!

内容的提问来源于stack exchange,提问作者Furin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:40:22