kd树的创建和求最近邻

 1 import numpy as np
 2 arr = np.array([[2, 3], [5, 4], [9, 6], [4, 7], [8, 1], [7, 2]])
 3 arr.shape
 4
 5 class KDTree():
 6     def __init__(self):
 7         self.value = None
 8         self.left = None
 9         self.right = None
10         self.axis = None
11
12 def create(arr, k, h=0):
13     if arr.shape[0] == 0:
14         return None
15     tree = KDTree()
16     axis = h % k
17
18     if arr.shape[0] == 1:
19         tree.value = arr[0]
20         tree.left = None
21         tree.right = None
22         tree.axis = axis
23     else:
24         arr = sorted(arr, key = lambda x:x[axis])
25         arr = np.array(arr)
26         i = arr.shape[0]//2
27
28         tree.value =  arr[i]
29         tree.left = create(arr[0:i], k, h+1)
30         tree.right = create(arr[i+1:], k, h+1)
31         tree.axis = axis
32     return tree
33
34 k = KDTree()
35
36 k = create(arr, arr.shape[1])
37
38 def preOrder(k):
39     print(‘当前节点:‘ + str(k.value))
40
41     if k.left:
42         preOrder(k.left)
43     if k.right:
44         preOrder(k.right)
45
46 preOrder(k)
47
48 def dis(a, b):
49     return np.linalg.norm(a-b)
50 def search(kd, goal, k, h=0):
51     ‘‘‘输入:kd树,目标点、特征维度k以及当前深度h‘‘‘
52     ‘‘‘输出:在kd树上的与目标点距离(欧氏距离)最近的距离‘‘‘
53     if kd.left == None and kd.right == None:
54         return dis(goal, kd.value)
55     if kd.left == None:
56         return min(search(kd.right, goal, k, h+1), dis(kd.value, goal))
57     if kd.right == None:
58         return min(search(kd.left, goal, k, h+1), dis(kd.value, goal))
59     axis = h%k
60
61     if goal[axis] < kd.value[axis]:
62         cur_dis = search(kd.left, goal, k, h+1)
63     else:
64         cur_dis = search(kd.right, goal, k, h+1)
65
66
67     if cur_dis < kd.value[axis]-goal[axis]:////cut  取绝对值
68         return cur_dis;
69     else:
70         if goal[axis] < kd.value[axis]:
71             cur_dis = min(search(kd.right, goal, k, h+1), cur_dis, dis(kd.value, goal))
72         else:
73             cur_dis = min(search(kd.left, goal, k, h+1), cur_dis, dis(kd.value, goal))
74     return cur_dis
75
76 search(k, np.array([9, 6]), 2)

原文地址:https://www.cnblogs.com/liuwenhan/p/11723354.html

时间: 2024-07-31 18:10:52

kd树的创建和求最近邻的相关文章

【特征匹配】SIFT原理之KD树+BBF算法解析

继上一篇中已经介绍了SIFT原理点击打开链接,最后得到了一系列特征点,每个特征点对应一个128维向量.假如现在有两副图片都已经提取到特征点,现在要做的就是匹配上相似的特征点. 相似性查询有两种基本方式:1.范围查询:即给点查询点和查询阈值,从数据集中找出所有与查询点距离小于阈值的点. 2.K近邻查询:给点查询点及正整数K,从数据集中找到与查询点最近的K个数据,当K=1时,就是最近邻查询. 特征匹配算子可以分为两类:1.穷举法:即将数据集中的点与查询点逐一计算距离,如果图1提取到N1个特征点,图2

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

bzoj 3053 HDU 4347 : The Closest M Points kd树

bzoj 3053 HDU 4347 : The Closest M Points  kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差较大的维度分开(建树常数大)或者每一位轮换分割(询问常数大),后者更快也更好些,以后就果断写第二种了. #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using

kd树 求k近邻 python 代码

  之前两篇随笔介绍了kd树的原理,并用python实现了kd树的构建和搜索,具体可以参考 kd树的原理 python kd树 搜索 代码 kd树常与knn算法联系在一起,knn算法通常要搜索k近邻,而不仅仅是最近邻,下面的代码将利用kd树搜索目标点的k个近邻. 首先还是创建一个类,用于保存结点的值,左右子树,以及用于划分左右子树的切分轴 class decisionnode: def __init__(self,value=None,col=None,rb=None,lb=None): sel

多维空间分割树--KD树

算法介绍 KD树的全称为k-Dimension Tree的简称,是一种分割K维空间的数据结构,主要应用于关键信息的搜索.为什么说是K维的呢,因为这时候的空间不仅仅是2维度的,他可能是3维,4维度的或者是更多.我们举个例子,如果是二维的空间,对于其中的空间进行分割的就是一条条的分割线,比如说下面这个样子. 如果是3维的呢,那么分割的媒介就是一个平面了,下面是3维空间的分割 这就稍稍有点抽象了,如果是3维以上,我们把这样的分割媒介可以统统叫做超平面 .那么KD树算法有什么特别之处呢,还有他与K-NN

KNN算法与Kd树

最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知样本的类别,以全部训练样本作为代表点,计算未知样本与所有训练样本的距离,并以最近邻者的类别作为决策未知样本类别的唯一依据.但是,最近邻算法明显是存在缺陷的,比如下面的例子:有一个未知形状(图中绿色的圆点),如何判断它是什么形状? 显然,最近邻算法的缺陷--对噪声数据过于敏感,为了解决这个问题,我们可

k近邻法的C++实现:kd树

1.k近邻算法的思想 给定一个训练集,对于新的输入实例,在训练集中找到与该实例最近的k个实例,这k个实例中的多数属于某个类,就把该输入实例分为这个类. 因为要找到最近的k个实例,所以计算输入实例与训练集中实例之间的距离是关键! k近邻算法最简单的方法是线性扫描,这时要计算输入实例与每一个训练实例的距离,当训练集很大时,非常耗时,这种方法不可行,为了提高k近邻的搜索效率,常常考虑使用特殊的存储结构存储训练数据,以减少计算距离的次数,具体方法很多,这里介绍实现经典的kd树方法. 2.构造kd树 kd

算法5-6:Kd树

问题 给定一系列的点,和一个矩形.求矩形中包含的点的数量. 解答 这个问题可以通过建立矩阵来进行求解.首先将一个空间分割成矩阵,将点放置在对应的格子中,再计算矩形覆盖的格子,再判断格子中的点是否包含在矩形中 这种方法的问题是,可能这些点全都集中在一个格子中.这种情况下算法的效率比较低. 这种问题在地图的应用中非常常见. 因此需要引入2D树的概念,使得矩阵的分解会根据点的密度自动适应. 2D树 下图展示了2D树的样子. 2D树的构建 每次加入一个点时,将平面分成两半. 加入第二个点时,由于第二个点

kd树(k-dimensional tree)(1)

kd树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 索引结构中相似性查询有两种基本的方式:一种是范围查询(range searches),另一种是K近邻查询(K-neighbor searches).范围查询就是给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据:K近邻查询是给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时,就是最近邻查询(nearest ne