【发布时间】:2014-01-27 16:43:35
【问题描述】:
我正在尝试编写自己的 KD-Tree 实现,并最终实现 kNN。而且我有点难以理解 KD-Tree 如何构建搜索树。
在维基百科上它说它找到了值的中值并将其用作树的根。
但是当有很多维度时,你将如何计算中位数?
【问题讨论】:
标签: data-structures tree machine-learning kdtree
我正在尝试编写自己的 KD-Tree 实现,并最终实现 kNN。而且我有点难以理解 KD-Tree 如何构建搜索树。
在维基百科上它说它找到了值的中值并将其用作树的根。
但是当有很多维度时,你将如何计算中位数?
【问题讨论】:
标签: data-structures tree machine-learning kdtree
你不会在多个维度中找到中位数(实际上,多维数字没有有意义的顺序)。在 kd 树的每一层,您都专注于一个维度。您根据这个维度选择中位数,忽略其他组件。
请注意,您可以使用除中位数以外的许多标准,具体取决于您要执行的操作。同样,选择一个好的方案来决定每个节点的维度是一门艺术,尽管几乎每个方案都是正确的。
【讨论】:
不需要找到中位数:来自维基百科:
另请注意,不需要选择中点。在那里面 情况下,结果很简单,无法保证树 会平衡。避免编写复杂代码的简单启发式方法 线性时间中值查找算法,或使用 O(n log n) 排序的 所有n个点,就是用sort求一个固定个数的中位数 随机选择的点作为分割平面。在实践中, 这种技术通常会产生很好的平衡树。
【讨论】:
您可以简单地将点按一维排序,然后选择 中位数为根,递归构造子树(其他维度排序) 这是一个实现: https://github.com/tavaresdong/cs106l/blob/master/KDTree/src/KDTree.h
【讨论】: