kd树的实现

Katjas-kd-tree的Python项目详细描述


kd树实现

kd搜索树的一种实现,它具有查找最近邻的功能,在大型数据集上使用线性搜索需要很长时间。这就是kd搜索树的来源,因为它们可以一次排除大部分数据集。
这个项目是作为CS110/计算:用算法解决问题课程的最后一个项目创建的。

安装指南

打开命令中心并粘贴以下内容

pip install Katjas-kd-tree

如何运行

安装软件包后,输入

import kd_tree as kd

您现在可以使用以下功能

kd.build_tree(dict)
# this will build a kd-tree from a given dictionary of format key:[values]
kd.distance(lsta,lstb)
# returns the distance between two points a and b with coordinates given by lsta and lstb
kd.find_approx_nearest(tree,value)
# returns the approximate nearest neighbor for a given value
kd.find_exact_nearest(tree,value)
# returns the exact nearest element of the tree to the value

示例用例

在实验室(或CIELAB)颜色空间中的命名颜色数据集中查找最接近的颜色。这种颜色空间的工作原理类似于rbg颜色,但其设计是为了让看起来类似于huymans的颜色在颜色空间中彼此更接近。第一个维度是从亮到暗的光谱,另两个维度描述从负值到正值的绿-红和蓝-黄值。有关实验室颜色的详细信息:https://en.wikipedia.org/wiki/CIELAB_color_space
我们不能使用通常的快速搜索方法或二进制搜索树,因为数据有超过1维,不能简单地排序。因此,我们可以创建一个具有3维的树,其中每个新的级别都沿着一个新的维拆分,并根据需要迭代所有这些级别。这使得我们能够很快地得到最近邻的近似值,并且稍加努力,找到比线性搜索快的最近邻。

# importing a dataset of paint colors and their position in the LAB colorspace
with open ("paintcolors.json") as json_file:
    paintcolors=json.load(json_file)
# creating a tree out of the paintcolors
painttree=kd.build_tree(paintcolors)
# finding the approximate and exact nearest color to [0,0,0]
print((kd.distance(kd.find_approx_nearest(painttree,[0,0,0]).value,[0,0,0]),
    kd.find_approx_nearest(painttree,[0,0,0]).name,
    kd.find_approx_nearest(painttree,[0,0,0]).value))
print(kd.find_exact_nearest(painttree,[0,0,0]))

这将返回近似和精确的最近颜色到[0,0,0]
(0.23327147726897515,“通用黑色”,[0.233007,0.010686,-0.0030215])
(0.22615200000001437,“微光区”,[0.226152,5.54817E-08,5.84874E-08])

生成的kd树如下所示(为了清楚起见,节点不在彼此上方)
Visualization of the kd-tree for paintcolors
如果您想自己运行此代码,请从https://github.com/katjadellalibera/KD-tree-implementation/blob/master/paintcolors.json下载数据,从https://github.com/katjadellalibera/KD-tree-implementation/blob/master/example.py下载代码

背景

1,时间复杂度:< > > > 线性搜索以O(n)复杂度运行,因为它必须检查每个值。FopyOnAdxxRealMead以$O(\log(n))的平均复杂度运行,因为它只需要下行一个深度为$\Logi2(n)$的二叉树。在最坏的情况下,我们有一个形状奇怪的树,就像只有两个节点的树,其中最坏的运行时可能是$o(n)$,因为每个节点都被访问。find_exact_nearest函数一次将排除较少的树,但仍在$o(\log(n))$中运行,只是具有较高的常数因子。
{STR 1 }空间复杂度:< /强> BR/> 将数据点存储为节点而不是在字典或数组中仍然需要$O(n)$空间复杂度。可能有一个稍高的常数项k,代表分裂维度d和左右子指针,但总复杂度为o(n)$ < p > P >

依赖关系

实现依赖于预安装的包random、math和json以及numpy包。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在Spring中从不同的控制器调用RestController方法?   来自Intellij生成代码的java WSDL客户端   基于Eratosthenes筛的Java素数计算器算法   java我们可以从hql查询中获得单个对象吗?   java使用通过PUT方法发送的字符串   java使用Jogl直接从volatileImage创建纹理   java Shorting实时Firebase以降序无休止地滚动数据   JavaWatson与SpringMVC的对话   使用代理的java HQL getResultSet   java特定的重新绘制管理器可以用于特定的JPanel吗?   Java Eclipse不会打印到控制台   AmazonWeb服务如何将使用java13编译的java应用程序转换为aws lambda函数   xslt使用Java从XSLFO生成HTML   java切换Android应用程序中基于开关的对话框按钮选择   用于验证名称的Java正则表达式   将json参数发布到REST服务时发生java错误   在无头模式下使用Chrome驱动程序配置时,WebDriversSample脚本中出现java面临预期条件失败错误   java Android上的本机方法如何与电源管理生命周期交互?   GuavaJava:用于确定等价性的外部类?   屏幕上的JavaFX中心舞台