最近的作业需要用到KNN,简单看了一些资料,发现一篇还不错的文章,非常感谢这位博主的介绍和总结,本文主要是基于此做的一些粗略笔记:
http://blog.csdn.net/u010551621/article/details/44813299
关于KNN,思想非常简单,就是寻找离自己最近的k个点。
一种常见的用法是:做分类器。找到最近的k个点,按照少数服从多数的思想。
另一种常见用法是:构建图。
kd树的介绍
首先看一下bst
bst(二叉查找树):如果左子树上的节点存储的数值都小于根节点中存储的数值,并且右子树上的节点存储的数值都大于根节点中存储的数值,那么这样的二叉树就是一颗二叉查找树
kd数跟二叉树是类似的,区别在于,kd是对高维数据,二叉树是对一维数据。
那么kd-tree与bst不同的地方在于进行分支决策的时候,还需要选择一个维度的值进行比较
kd-tree是一种对高维空间的数据点进行划分的特殊数据结构,主要应用就是高维空间的数据查找,如:范围搜索和K近邻(knn)搜索,范围搜索就是给定查询点和距离阈值,获取在阈值范围内的所有数据点;knn搜索就是给定查询点和搜索点的数目n,查找出到搜索点最近的n个点的数目;
因为我要尽可能将相似的点放在一颗子树里面,所以kd-tree采取的思想就是计算所有数据点在每个维度上的数值的方差, 然后方差最大的维度就作为当前节点的划分维度,这样做的原理其实就是:方差越大,说明这个维度上的数据波动越大,也就说明了他们就越不可能属于同一个空间,需要在这个维度上对点进行划分,这就是kd-tree节点选择划分维度的原理.
另一个比较重要的就是当前节点的确定:
割点(也就是节点存储的数据节点)一般取在分割维度上的值为中间值的点