kd树划分空间选择维度使用方差的好处

最近学习《统计学习方法》里的kd树时,虽然算法的原理比较清晰,但是一直感觉选择维度的时候使用j = (i mod k) + 1的轮替模式会导致空间分的太不均衡,可能导致搜索kd树的某些时候效率偏低。
在知乎上看到
使用方差来选择维度,使用中值来作为结点取值,感觉这种做法可能能更好的划分每个结点的左右子树所代表的空间。
后来看到一篇博客(http://blog.sina.com.cn/s/blog_6f611c300101bysf.html)中所使用的解释方法既通俗又挺形象,所以摘取了其中片段:

最简单的方法就是轮着来,即如果这次选择了在第i维上进行数据划分,那下一次就在第j(j≠i)维上进行划分,例如:j = (i mod k) + 1。想象一下我们切豆腐时,先是竖着切一刀,切成两半后,再横着来一刀,就得到了很小的方块豆腐。

可是“轮着来”的方法是否可以很好地解决问题呢?再次想象一下,我们现在要切的是一根木条,按照“轮着来”的方法先是竖着切一刀,木条一分为二,干净利落,接下来就是再横着切一刀,这个时候就有点考验刀法了,如果木条的直径(横截面)较大,还可以下手,如果直径较小,就没法往下切了。因此,如果K维数据的分布像上面的豆腐一样,“轮着来”的切分方法是可以奏效,但是如果K维度上数据的分布像木条一样,“轮着来”就不好用了。因此,还需要想想其他的切法。

如果一个K维数据集合的分布像木条一样,那就是说明这K维数据在木条较长方向代表的维度上,这些数据的分布散得比较开,数学上来说,就是这些数据在该维度上的方差(invariance)比较大,换句话说,正因为这些数据在该维度上分散的比较开,我们就更容易在这个维度上将它们划分开,因此,这就引出了我们选择维度的另一种方法:最大方差法(max invarince),即每次我们选择维度进行划分时,都选择具有最大方差维度。

你可能感兴趣的:(kd树)