我正在尝试在 Python 中实现这个算法,但是由于我缺乏对树结构的理解,我对分区树的创建过程感到困惑。
简要说明:
链接算法,用于将高维特征空间划分为内部节点和叶节点,以便可以快速执行查询。
它使用特定的随机测试划分大空间,超平面将一个大单元格分成两个。
代码片段:
def random_test(self, main_point): # Main point is np.ndarray instance
dimension = main_point.ravel().size
random_coefficients = self.random_coefficients(dimension)
scale_values = np.array(sorted([np.inner(random_coefficients, point.ravel())
for point in self.points]))
percentile = random.choice([np.percentile(scale_values, 100 * self.ratio), # Just as described on Section 3.1
np.percentile(scale_values, 100 * (1 - self.ratio))])
main_term = np.inner(main_point.ravel(), random_coefficients)
if self.is_leaf():
return 0 # Next node is the center leaf child
else:
if (main_term - percentile) >= 0: # Hyper-plane equation defined in the document
return -1 # Next node is the left child
else:
return 1 # Next node is the right child
self.ratio正如上面链接的算法中提到的,正在确定树的平衡和浅层,1/2它应该生成最平衡和浅层的树。
然后我们进入迭代部分,树不断地划分空间,直到它到达叶节点(注意关键字reach),问题是,它永远不会真正到达叶节点。
因为,上面链接的文档中叶节点的定义是这样的:
def is_leaf(self):
return (self.capacity * self.ratio) <= self.cell_count() <= self.capacity
其中self.cell_count()是单元格中self.capacity的点数,是单元格可以拥有的最大点数,self.ratio是分割比。
我的完整代码应该通过在初始迭代时创建新节点来划分特征空间,直到创建叶节点(但从未创建叶节点)。请参阅包含除法过程的片段。
在我们向它们添加任何点之前是否准备好二叉树(填充空节点)?如果是这样,我们不需要定义树的级别(深度)吗?
如果不是,是否在向其中添加点时创建了二元分区树?如果是这样,那么第一个点(来自第一次迭代)是如何添加到树中的?
偶然的你
阿晨1998
相关分类