K-D树
- 点云数据集比较大,为了方便进行邻近检索等,就必须对这些离散的点建立拓扑关系,K-D数就是其中一种
- K-D树基于二叉树来实现
我们这里只做简介,如果想获取详细信息,可参考文档,注意文档下载之后,可以用markdown打开,否则用浏览器,可能会看不到图片 - 这里首先介绍下几个重要的概念
- 严格二叉树:树的每个非叶子节点的度始终为二
- 满二叉树:树的每一层的结点都达到最大值,如果一个二叉树是层数是K,如果它是满二叉树,那么他的结点总数必定是 ( 2 k ) − 1 (2^k)-1 (2k)−1
- 完全二叉树:从形式上讲它是个缺失的的三角形,但所缺失的部分一定是右下角某个连续的部分,最后那一行可能不是完整的,对于k层的完全二叉树,节点数的范围 2 ( k − 1 ) − 1 < N < 2 k − 1 2^ {(k - 1)} -1 < N< 2^k - 1 2(k−1)−1<N<2k−1,设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 总结:这货按顺序但是没有走完丫?是不是很悲剧
- 二叉树的遍历方法
- 按递归方式走三角形
- 前序遍历:中-左-右
- 中序遍历:左-中-右
- 后续遍历:左-右-中
- 注意:所有过程都是递归进行的
- 按递归方式走三角形
- 二插树插入操作
- 分为四种情况:
- 左左失衡:parent 右旋
- 左右失衡:cur左旋,parent右旋
- 右右失衡:parent 左旋
- 右左失衡:cur右旋,parent左旋
- 分为四种情况:
KNN
KNN(K-Nearest Neighbor)是最简单的机器学习算法之一,可以用于分类和回归,是一种监督学习算法。它的思路是这样,如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。也就是说,该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
k-d中的基本概念
- 切分域
- 即切分的维度⽅向,在这个例⼦中,也就是在⼆维平⾯上,⾯点师必须决定,我这第⼀⼑是平⾏于x轴横着切还是平⾏于y轴竖着切?
- 一轮:每个维度切分一次称之为一轮
- 切分维度的方法有很多,有根据方差的,有的直接根据维度顺序就可以了。
- 切分点:就是被切过的点
- 下面就是一个案例,这个我这边就不介绍了,请见上文提供的markdown文件里面有。
- 查找最临近点的方法
- 首先,按照x-y-z,找到在叶子结点上最近的点。
- 按中序遍历,看看遍历节点,与当前节点的特征空间临近对比,如果当前节点确实是最近的,则遍历结束,否则更新节点继续就可以了。