我编写了一个代码,通过对每个可用节点进行随机测试直到它到达地面来创建随机二叉树。
因此,假设我们的根节点充满了500点。我们将创建两个空的子节点(左侧和右侧),然后将所有点迭代传递给random_test(x)
,这将决定该点必须传递到左侧还是右侧节点。每个节点必须具有平衡的点数(两个节点的理想点数均为250,但这不是必须的)。
请参见以下代码:
import numpy as np
def random_test(self, main_point):
random_coefficients = self.random_coefficients()
scale_values = [np.inner(self.random_coefficients(), point[:self.indices].ravel())
for point in self.points]
percentile = np.percentile(scale_values, self.ratio * 100) # notice here
main_term = np.inner(main_point[:self.indices].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
def random_coefficients(self):
return np.random.uniform(size=self.indices)
self.ratio
在这种情况下等于0.5,百分位数是节点中所有点的50%乘以[0, 1]
之间的随机系数(scale_values变量)。
百分位数管理树的浅浅程度和平衡程度,接近50%的百分位数将使树达到最佳平衡和浅浅程度,但这不是必需条件。
np.percentile
很快,但是可能没有必要的快。
有什么方法可以快速估计数组的百分位数,使其接近1-p和p(其中p是百分位数)吗?根据{{3}}中的评论,可以执行一种短路的二进制搜索来找到接近p的百分位数(在这种情况下为1/2),如何实现?有什么更好的方法吗?
谢谢!