基于距离而非邻居的KNN:三列数据下的邻近点查询需求
基于距离阈值的KNN邻近点查询实现
我来帮你搞定这个基于距离而非固定邻居数的邻近点查询需求。先明确下我们的基础数据集:
原始数据集
| A | B | Distance |
|---|---|---|
| point_a | point_b | 20 |
| point_a | point_c | 30 |
| point_a | point_d | 40 |
| point_a | point_e | 25 |
| point_g | point_a | 26 |
| point_c | point_d | 30 |
| point_c | point_e | 30 |
| point_d | point_e | 40 |
需求说明
我们需要实现一个基于距离阈值的邻近点查询功能(区别于传统固定k值的KNN):给定目标点和距离上限,找出所有与该点的距离不超过阈值的邻近点。比如查询point_a周边28英里内的点,结果应该是point_b、point_e、point_g。
实现思路与代码示例
这里我用Python来实现这个功能,逻辑清晰易懂:
- 先把数据集加载成便于处理的DataFrame结构
- 编写查询函数,遍历所有记录:
- 检查记录中的任意一个点是否是目标点
- 如果是,判断对应的距离是否小于等于阈值
- 用集合收集符合条件的另一个点,自动避免重复(比如
point_a <-> point_g和point_g <-> point_a属于同一邻近关系)
import pandas as pd # 加载数据集 data = [ ["point_a", "point_b", 20], ["point_a", "point_c", 30], ["point_a", "point_d", 40], ["point_a", "point_e", 25], ["point_g", "point_a", 26], ["point_c", "point_d", 30], ["point_c", "point_e", 30], ["point_d", "point_e", 40], ] df = pd.DataFrame(data, columns=["A", "B", "Distance"]) def find_neighbors_by_distance(target_point, max_distance): neighbors = set() # 遍历所有距离记录 for _, row in df.iterrows(): if row["A"] == target_point and row["Distance"] <= max_distance: neighbors.add(row["B"]) elif row["B"] == target_point and row["Distance"] <= max_distance: neighbors.add(row["A"]) return sorted(neighbors) # 测试查询 result = find_neighbors_by_distance("point_a", 28) print(f"point_a周边28英里内的邻近点:{result}") # 输出:point_a周边28英里内的邻近点:['point_b', 'point_e', 'point_g']
关键点说明
- 用集合存储邻近点,自动去重,避免因双向记录导致的重复结果
- 同时处理
A是目标点和B是目标点的情况,确保不会遗漏反向的距离记录 - 最后返回排序后的结果,提升可读性
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

