我需要找到一组数字中的哪个百分位数超过阈值。有没有办法可以加快速度?对于预期的应用程序,我的实现太慢了。万一这有任何变化,我将使用运行我的程序mpirun -np 100 python program.py
。我不能使用numba,因为该程序的其余部分使用try / except语句。
import numpy as np
my_vals = []
threshold_val = 0.065
for i in range(60000):
my_vals.append(np.random.normal(0.05, 0.02))
for i in np.arange(0,100,0.001):
if np.percentile(my_vals,i) > threshold_val:
perc = 1*i
break
else: perc = 100
由于高斯(正态)分布会产生钟形曲线,因此您应该能够以最佳概率计算出百分位数,然后编写代码首先进行检查,然后使用经过修改的二进制搜索找到最佳的最低百分比临界点。
例如,如果您确定参数最有可能受到支持,例如17.951(这只是一个示例,我实际上并没有理会它),则应从该点开始而不是从0开始。将其视为二进制搜索-将下限从0开始,将上限从100.0开始,并设置点以将列表一分为二作为分布的最佳百分位数。
如果您当前的上限超过threshold_val
,则将下半部分一分为二,找到与之匹配的最低值;如果未超过阈值,则将上半部分等分。等等,例如,在0.000到100.000的范围内,如果从17.951开始并发现它没有超过阈值,则将边界调整为17.952到100.000,然后尝试58.976 (之间的一半)。一旦找到一个高于阈值的值,则将该值用作上限(因为这是非最佳答案)。继续此过程,直到上下限相差0.001,这为您提供了最佳答案。平均而言,您应该运行大约17个测试,而不是100,000个。
万一正态分布发生变化,您还可以自动计算最佳值,因为该分布会产生一个钟形曲线,并且无论如何您都将基于参数知道该钟形曲线的统计信息。
您的解决方案仅需要找到百分位数高于阈值的最小值,因此此方法应最大程度地减少需要检查的样本数量。
还有一个提示:np.percentile必须在代码中对my_vals进行100,000次排序;我不知道预先排序的列表是否有帮助,但是可能值得检查(您可能必须测试几个可能的排序参数,因为它似乎没有记录排序的方向)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句