KNN算法之KD树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
KNN算法之KD树
KD树算法是先对数据集进⾏建模,然后搜索最近邻,最后⼀步是预测。
KD树中的K指的是样本特征的维数。
⼀、KD树的建⽴
m个样本n维特征,计算n个特征的⽅差,取⽅差最⼤的第k维特征作为根节点。
选择第k维特征的中位数作为切分点,⼩于中位数的放左⼦树,⼤于中位数的放右⼦树,递归⽣成。
举例
有⼆维样本6个,{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}:
1、找根节点,6个数据点在x、y维度上的⽅差分别是6.97,5.37,x维度⽅差最⼤,因此选择x维进⾏键树;
2、找切分点,x维中位数是(7,2),因此以这个点的x维度的取值进⾏划分;
3、x=7将空间分为左右两个部分,然后递归使⽤此⽅法,最后结果为:
(7,2)
/ \
(5,4)(9,6)
/ \ /
(2,3)(4,7)(8,1)
⼆、搜索最近邻
先找到包含⽬标点的叶⼦节点,然后以⽬标点为圆⼼,⽬标点到叶⼦节点距离为半径,得到超球体。
最近邻的点⼀点在内部。
返回叶⼦节点的⽗节点,检查另⼀个叶⼦节点包含的超矩体是否和这个超球体相交,相交的话在这个叶⼦节点寻找有没有更近的近邻,更新。
当回溯到根节点时,结束。
此时保存的节点就是最近邻节点。
KD树划分后可以⼤⼤减少⽆效的最近邻搜索,很多样本点由于所在的超矩形体和超球体不相交,根本不需要计算距离。
⼤⼤节省了计算时间。
1、对(2,4.5)搜索最近邻,先从(7,2)开始找,2<7因此在左⼦树;
2、4.5>4,在右⼦空间找到叶⼦节点(4,7),计算距离为3.202,以它为半径得到超球体,返回⽗节点(5,4);
3、计算⽗节点与(2,4.5)的距离=3.041<3.202,更新保存的最近节点,同时由于左⼦空间与超球体相交,所以到左⼦空间中找有没有叶⼦节点;
4、左⼦空间中(2,3)节点与⽬标节点更近,找到最近邻。
三、KD树预测
在kd树搜索最近邻的基础上,选择到了第⼀个最近邻样本,把它设置为已选,然后第⼆轮中忽略这个样本,重新找最近邻。
四、球树
kd树对样本分布不均匀时,效果不好。
球树:每个分割快都是超球体。
过程:从球中选择⼀个离球的中⼼最远的点,然后选择第⼆个点离第⼀个点最远,将所有的点分配到这两个点上,计算聚类中⼼,然后对这两个⼩超球体递归使⽤这个⽅法。