1.什么是Kd树,为什么要引入Kd树
knn是寻找k个邻近的点,在这个过程中,需要一个点一个点的与未分类点进行比较,这样的时间复杂度非常高,因此引入了一种原理类似二叉树的Kd树,以减少比较搜索的次数。
kd树的本质思想:
A距离B远,B距离C近,那么A距离C也远
2.大致原理图:
3.具体过程
1>.树的建立
1.构造根结点(即上述的黄色结点),构造包括所有点的超矩形区域(外面的方框)。
2.通过递归的方法,对k维空间进行划分,生成子结点。
在超矩形区域上选择一个坐标轴(找已知点散度较大的分量(最大最小差较大的、方差大的)的方向作为轴),和该方向的一个切分点(已知点中,该方向分量排中间的点(中位数)),过切分点垂直于坐标轴的方向画出一个超平面(垂线、面..),这个超平面将原超矩形区域划分为两个子区域A,B;
对于A,B的划分,选择除了上次选择的分量方向的新轴(也是选择除了上次的,散度最大的),再找划分点,再垂直划分。。。。
3.重复上述过程,直到没有结点为止
举例:
2>.最近邻域搜索
例子:
简单不需要跨区域的:
复杂的跨区域的: