估算数组百分位数的快速方法

时间:2018-12-24 12:40:35

标签: python arrays numpy median percentile

我编写了一个代码,通过对每个可用节点进行随机测试直到它到达地面来创建随机二叉树。

因此,假设我们的根节点充满了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),如何实现?有什么更好的方法吗?

谢谢!

0 个答案:

没有答案