三、k近邻法的实现:kd树
前面已经介绍了k近邻法的算法和模型的相关知识理解,现在我们应该着手如何实现k近邻法了,也就是说怎么在所有的训练实例中快速有效地找到那k个最近邻的实例点。
我们可以想象,k近邻法最简单的实现方法就是线性扫描(linear scan),线性扫描的方法就是踏踏实实地计算出所有训练实例点与新的实例点之间的“距离”,然后从中取出最小的k个即可。这种方法理论上是完美无缺的,但是当训练集过大时,计算所耗费的时间就会过多,效率也会下降,所以这种死板方法是不可取的。
我们需要找到一个更好的方法来提高大训练集的k近邻搜索效率,可以考虑使用特殊的结构来存储训练数据,以减少计算距离的次数。实现的方法有很多,这里我们主要介绍其中的kd树(kd tree)方法,kd树使用了树结构来存储训练数据。
kd树即k维树,对应k维欧几里得空间,是基于欧氏距离度量的。
kd树:存储k维空间数据以便对其进行快速检索的树形数据结构。这里的k表示特征空间中特征向量的长度,即一个特征向量有k个特征;而k近邻中的k表示与新的实例点近邻的训练实例点的个数。两个k的意义是不一样的。
我们分两步来介绍如何通过kd树实现k近邻法。
第一步:构造kd树
kd树是二叉树,表示对k维空间的一个划分。
首先你需要明白什么是根结点、结点以及叶结点:
根结点就是就开始的结点,结点特指中间结点,叶结点指最终的结点(不能继续划分)。二叉树结构
"构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形