【数学】kd树算法之思路篇.docxVIP

  • 5
  • 0
  • 约3.2千字
  • 约 6页
  • 2021-03-16 发布于山东
  • 举报
【数学】 kd 树算法之思路篇 导语: kd 树是一种二叉树数据结构,可以用来进行高 效的 kNN 计算。kd 树算法偏于复杂, 本篇将先介绍以二叉 树的形式来记录和索引空间的思路,以便读者更轻松地理解 kd 树。图较多,小心流量 作者:肖睿编辑:宏观经济算命师本文由 JoinQuant 量化课 堂推出,本文的难度属于进阶(上) ,深度为 level-1 。阅读本文之前请掌握 kNN ( level-1 )的知识。前言 kd 树 k-dimensional tree )是一个包含空间信息的二项树数据结构,它是用来计算 kNN 的一个非常常用的工具。如果特征的维度是 D ,样本的数量是 N,那么一般来讲 kd 树算法的 复杂度是 O(D log(N)) ,相比于穷算的 O(DN) 省去了非常多 的计算量。因为 kd 树的概念和算法较为复杂,固将本教程 分为“思路篇”和“详细篇” 。两篇的内容在一定程度上是 重叠的,但是本篇注重于讲解 kd 树背后的思想和直觉,告 诉读者一颗二项树是如何承载空间概念的,我们又该如何从 树中读取这些信息;而之后的详细篇则详细讲解 kd 树的定 义,如何构造它并且如何计算 kNN 。出于教学起见, 本文讲 的例子和算法与严格的 kd 树有一些差异。有算法经验或者 想尝试挑战的读者可以直接跳过本篇去读详细篇。关于在学习编程和算法时有没有必要自己制作轮子的问题,一直存在 着很多的争议。作者认为,做不做轮子暂且不论,但是有必 要去了解轮子是怎么做出来的。 Python 的 scikit-learn 机器学习包提供了蛮算、 kd 树和 ball 树三种 kNN 算法,学完本篇的读者若无兴趣自撰算法,可以非常轻松地使用该包。直觉给定一堆已有的样本数据,和一个被询问的数据点(红 色五角星),我们如何找到离五角星最近的 15 个点?先忽略 在编程上的实现,想一想一个人如何主观地执行。嗯,他一定会把在五角附近的一些点中,分别计算每一个的距离,然后选最近的 15 个。这样可能只需要进行二三十次距离计算,而不是 300 次。如图,只对紫圈里的点进行计算。啊哈!问题来了。我们讲到的“附近”已经包含了距离的概念,如果不经过计算我们怎么知道哪个点是在五角星的“附近”?为什么我们一下就认出了“附近”而计算机做不到?那是因为我们在观看这张图片时,得到的输入是已经带有距离概念的影像,然而计算机在进行计算时得到的则是没有距离概念的 坐标数据。如果要让一个人人为地从 300 组坐标里选出最近 的 15 个,而不给他图像,那么他也省不了功夫,必须要把 个全部计算一遍才行。这样来说,我们要做的就是在干巴巴的坐标数据上进行加工,将空间分割成小块,并以合理地方法将信息进行储存,这样方便我们读取“附近”的点。切割这只危险的兔子,它又回来了!它今天上了四个纹身,爱心、月牙、星星和眼泪,下面是它的照片。我们来回答一 个简单的问题:在这幅照片上,距离爱心最近的纹身是什么?记得上一篇文章中,我们选用的特征是每一只兔子的身高和体重;这次就不一样了,在这个问题中,每个纹身的特征是照片平面上的横轴和竖轴的坐标。对于这个问题,如果 进行蛮算的办法我们需要计算 3 次距离(分别和月亮、眼泪和星星算一次) 。下面我们要做的是把整个空间按照左右 和上下进行等分,并且把分割后的小空间以二叉树形式进行记录,这样可以很快地读取邻近的点而省去计算量。好,我们先竖向沿中间把这个兔子切成两半再沿横向从中间切成四份再沿着竖向平分八份最后再沿横向切一次。这次有些区 域是完全空白的,我们就把它舍弃不要了,得到 14 份:我 们再按照上下左右的关系把切开的图片做成一个二叉树,树的每一个节点是一幅图,它的两个枝是这幅图平分出来的子图。可以看出这个树状结构包含了很多局部性的信息,因为它的每一个节点都是按照上下或者左右进行平分的,因此如果两个点在树中的距离较近,那么它们的实际距离就是比较近的。 搜寻接下来我们要通过这棵二叉树找到离爱心最近的纹身。首先从树的最顶端开始,向下搜寻找到最底部包含爱心的节点。这个操作非常简单,因为每一次分割要么是沿着某纵线 X=a 要么是沿着横线 Y=a ,因此只需要判断爱心的 x 或 y 轴 坐标是大于 a 还是小于 a,便知道是向左还是右边选择树枝。 在找到了爱心之后,我们沿着相同的路径向上攀爬。只爬了 一节就发现了屁股上的两个纹身:这里看出,在 8 平分的情况下,爱心和月亮是在同一个区域的。在某种意义上来讲它 们是“近”的,但是我们还不能确定它们是最近的,因此还要继续向上攀爬寻找。再继续向上爬两个节点,都没有出现爱心和月亮以外的纹身。在下面这个节点中我们发现爱心和 月亮之间的距离 (红线)要小于爱心和分割线的距离 (蓝线),也就是说,不论分

文档评论(0)

1亿VIP精品文档

相关文档