作者 周知航
审核 张翔
ARGO曾经推出了ARGO:KNN算法介绍zhuanlan.zhihu.com
介绍了KNN算法的原理,其核心是寻找待测样本在训练样本中的k个近邻,从而从k个近邻中获取数量最多的类别作为待测样本的类别。
KNN算法是机器学习中最简单的算法之一,但是工程实现上,如果训练样本过大,则传统的遍历全样本寻找k近邻的方式将导致性能的急剧下降。 因此,为了优化效率,不同的训练数据存储结构被纳入到实现方式之中。在sikit-learn中的KNN算法参数也提供了'kd_tree'之类的算法选择项。本文将从如下几个方面阐述kd树:
kd树的概念
从例子理解kd树的构建及查找
ball tree 和其他树类型简介
一 kd树的概念
kd(k-dimensional)树的概念自1975年提出,试图解决的是在k维空间为数据集建立索引的问题。依上文所述,已知样本空间如何快速查询得到其近邻?唯有以空间换时间,建立索引便是计算机世界的解决之道。但是索引建立的方式各有不同,kd树只是是其中一种。它的思想如同分治法,即:利用已有数据对k维空间进行切分。
我们先回顾一下二叉查找树,这也是在一维空间中的kd树的情形:
由图可知,二叉树在时间复杂度上是O(logN),远远优于全遍历算法。对于该树,可以在空间上理解:树的每个节点把对应父节点切成的空间再切分,从而形成各个不同的子空间。查找某点的所在位置时,就变成了查找点所在子空间。上图仅仅是一维,如果换到二维,或者是更高维度上,这棵树该怎么建立? 又该怎么理解所切成的子空间呢?
我们可以用一个在网络上较为普遍的例子来演示一下二维的kd树构建及查找方式。
二 从例子理解kd树的构建及查找
假设有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}。
依据上文,对于一维空间的切分的最终结果实际上切出的是线段,同理,二维空间中,对于该6个点集最后的切分结果的空间应该是子平面集合。这里,kd树最终目标就是构建