k临近法的实现:kd树

 1 # coding:utf-8
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4
 5 T = [[2, 3], [5, 4], [9, 6], [4, 7], [8, 1], [7, 2]]
 6 S=[7, 3]
 7
 8 class node:
 9     def __init__(self, point):
10         self.left = None
11         self.right = None
12         self.point = point
13         self.parent = None
14         pass
15
16     def set_left(self, left):
17         if left == None: pass
18         left.parent = self
19         self.left = left
20
21     def set_right(self, right):
22         if right == None: pass
23         right.parent = self
24         self.right = right
25
26 def median(lst):
27     m = len(lst) / 2
28     return lst[m], m
29
30 def build_kdtree(data, d):
31     data = sorted(data, key=lambda x: x[d])
32     p, m = median(data)
33     tree = node(p)
34     del data[m]
35     if m > 0: tree.set_left(build_kdtree(data[:m], not d))
36     if len(data) > 1: tree.set_right(build_kdtree(data[m:], not d))
37     return tree
38
39 def distance(a, b):
40     return ((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) ** 0.5
41
42 def search_kdtree(tree, target,best=[]):
43     if len(best)==0: best = [tree.point,distance(tree.point, target)]
44     if target[0] < tree.point[0]:
45         if tree.left != None:
46             return search_kdtree(tree.left, target, best)
47     else:
48         if tree.right != None:
49             return search_kdtree(tree.right, target, best)
50     def update_best(t, best):
51         if t == None: return
52         t = t.point
53         d = distance(t, target)
54         if d < best[1]:
55             best[1] = d
56             best[0] = t
57     while (tree.parent != None):
58         update_best(tree.parent.left, best)
59         update_best(tree.parent.right, best)
60         tree = tree.parent
61     return best[0]
62
63 def showT(tree,d):
64     plt.plot(tree.point[0],tree.point[1],‘ob‘)
65     if tree.parent==None:
66         plt.plot([tree.point[0],tree.point[0]],[0,10])
67     elif d:
68         if tree.point[0]<tree.parent.point[0]:
69             plt.plot([0,tree.parent.point[0]],[tree.point[1],tree.point[1]])
70         else:
71             plt.plot([tree.parent.point[0],10],[tree.point[1],tree.point[1]])
72     else:
73         if tree.point[1]<tree.parent.point[1]:
74             plt.plot([tree.point[0],tree.point[0]],[0,tree.parent.point[1]])
75         else:
76             plt.plot([tree.point[0],tree.point[0]],[tree.parent.point[1],10])
77     if tree.left != None:
78         showT(tree.left,not d)
79     if tree.right != None:
80         showT(tree.right,not d)
81
82 kd_tree = build_kdtree(T, 0)
83 showT(kd_tree,0)
84 plt.annotate(‘S‘,xy = (S[0],S[1]+0.2))
85 plt.plot(S[0],S[1],‘^r‘)
86 result=search_kdtree(kd_tree,S)
87 print result  #[7, 2]
88 plt.show()

时间: 2024-10-01 13:31:37

k临近法的实现:kd树的相关文章

k近邻与kd树

k近邻是一种特别简单的有监督学习算法.给定一个带标签的训练数据集,从中选择与预测样本最近的k个训练样本,用这k个样本投票决定预测样本标签. k近邻法三要素:距离度量,k值选择和分类决策规则 为了提高k近邻搜索效率,比较常用的就是线性扫描和kd树(二叉树) kd树构造:对每个维度的特征依次寻找中位数划分子集,并以此中位数作为节点 代码: pass kd树搜索代码: 主要就是舍弃当前兄弟节点与当前圆没有相交的分支,减少搜索量(这里判断交集的时候,只需要依据父节点划分所依据的那一维度的值即可) 代码

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

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

初学kd树

一开始不会kd树的时候,感觉kd树一定很神,学了kd树发现kd树挺好写. kd树的每个节点有一个分割超平面,我是以深度%维数作为当前这一维的分割,比较时对于当前节点就比较这一维. 附上模板代码,求平面第k近距离(kd树裸题) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include&l

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

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

K 近邻算法(KNN)与KD 树实现

KD树节点 /// <summary> /// KD树节点 /// /2016/4/1安晟添加 /// </summary> [Serializable] public class KDTreeNode { /// <summary> /// 获取或设置节点的空间坐标 /// </summary> public double[] Position { get; set; } /// <summary> /// 获取或设置分裂维度的索引 /// G

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

2016 ICPC青岛站---k题 Finding Hotels(K-D树)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5992 Problem Description There are N hotels all over the world. Each hotel has a location and a price. M guests want to find a hotel with an acceptable price and a minimum distance from their locations.

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

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

KD树

什么是KD树 Kd-树是K-dimension tree的缩写,是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x,y,z..))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索).本质上说,Kd-树就是一种平衡二叉树. 首先必须搞清楚的是,k-d树是一种空间划分树,说白了,就是把整个空间划分为特定的几个部分,然后在特定空间的部分内进行相关搜索操作.想像一个三维空间,kd树按照一定的划分规则把这个三维空间划分了多个空间,如下图所示: KD树的构建