kd tree python 搜索

本文介绍了在处理海量数据时如何利用kd tree进行最近邻查找。提到了kd tree的Python实现,并给出了相应的测试代码链接。
摘要由CSDN通过智能技术生成

海量数据最近邻查找可以用kd tree

目前理解,kd tree需要的数据维度相同,否则会出问题

kd tree实现:https://github.com/stefankoegl/kdtree

下面是测试代码:

import kdtree

# Create an empty tree by specifying the number of
# dimensions its points will have
emptyTree = kdtree.create(dimensions=3)

K-D Tree(K-Dimensional Tree)是一种用于处理 k 维空间数据的数据结构。它可以用于搜索最近邻、范围搜索等问题。下面是一个简单的 Python 实现。 首先,我们需要一个节类来表示树中的节: ```python class Node: def __init__(self, point=None, axis=None, left=None, right=None): self.point = point # 节代表的 self.axis = axis # 划分轴 self.left = left # 左子树 self.right = right # 右子树 ``` 接下来,我们需要一个 `build_kdtree` 函数来构建 K-D Tree: ```python def build_kdtree(points, depth=0): n = len(points) if n <= 0: return None axis = depth % k # 选择轴 points.sort(key=lambda point: point[axis]) mid = n // 2 return Node( point=points[mid], axis=axis, left=build_kdtree(points[:mid], depth+1), right=build_kdtree(points[mid+1:], depth+1) ) ``` 这个函数会递归地将集分成两部分,构建 K-D Tree。 接下来,我们需要实现两个重要的子函数:`nearest_neighbor` 和 `range_search`。 `nearest_neighbor` 函数用于查 K-D Tree 中最近的: ```python def nearest_neighbor(root, point): best = None best_distance = float("inf") def search(node, depth=0): nonlocal best, best_distance if node is None: return distance = euclidean_distance(point, node.point) if distance < best_distance: best = node.point best_distance = distance axis = depth % k if point[axis] < node.point[axis]: search(node.left, depth+1) if point[axis] + best_distance >= node.point[axis]: search(node.right, depth+1) else: search(node.right, depth+1) if point[axis] - best_distance <= node.point[axis]: search(node.left, depth+1) search(root) return best ``` 这个函数会从根节开始递归地搜索 K-D Tree到与目标最近的。 最后,我们需要实现 `range_search` 函数来查 K-D Tree 中给定范围内的所有: ```python def range_search(root, lower, upper): result = [] def search(node, depth=0): if node is None: return if lower <= node.point <= upper: result.append(node.point) axis = depth % k if lower[axis] <= node.point[axis]: search(node.left, depth+1) if upper[axis] >= node.point[axis]: search(node.right, depth+1) search(root) return result ``` 这个函数会从根节开始递归地搜索 K-D Tree到所有满足条件的。 完整的代码如下所示: ```python import math k = 2 class Node: def __init__(self, point=None, axis=None, left=None, right=None): self.point = point # 节代表的 self.axis = axis # 划分轴 self.left = left # 左子树 self.right = right # 右子树 def euclidean_distance(p, q): return math.sqrt(sum((p[i] - q[i])**2 for i in range(k))) def build_kdtree(points, depth=0): n = len(points) if n <= 0: return None axis = depth % k # 选择轴 points.sort(key=lambda point: point[axis]) mid = n // 2 return Node( point=points[mid], axis=axis, left=build_kdtree(points[:mid], depth+1), right=build_kdtree(points[mid+1:], depth+1) ) def nearest_neighbor(root, point): best = None best_distance = float("inf") def search(node, depth=0): nonlocal best, best_distance if node is None: return distance = euclidean_distance(point, node.point) if distance < best_distance: best = node.point best_distance = distance axis = depth % k if point[axis] < node.point[axis]: search(node.left, depth+1) if point[axis] + best_distance >= node.point[axis]: search(node.right, depth+1) else: search(node.right, depth+1) if point[axis] - best_distance <= node.point[axis]: search(node.left, depth+1) search(root) return best def range_search(root, lower, upper): result = [] def search(node, depth=0): if node is None: return if lower <= node.point <= upper: result.append(node.point) axis = depth % k if lower[axis] <= node.point[axis]: search(node.left, depth+1) if upper[axis] >= node.point[axis]: search(node.right, depth+1) search(root) return result ``` 这是一个简单的 K-D TreePython 实现,可以用来解决搜索最近邻、范围搜索等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值