繁体   English   中英

在Python中从庞大的均匀分布中采样

[英]Sampling from a huge uniform distribution in Python

我需要从[0, 3*10^9]范围中选择3.7*10^8唯一值,并按顺序获取它们或将其保留在内存中。

为此,我开始研究一种简单的算法,在该算法中,我对较小的均匀分布(适合内存)进行采样,以便间接采样我真正感兴趣的较大分布。

该代码可在以下要点https://gist.github.com/legaultmarc/7290ac4bef4edb591d1e获得

由于无法实现更可靠的功能,因此我想知道您是否还有其他想法可以从大型离散制服中采样唯一值。 我正在寻找算法,模块或关于如何直接管理非常大的列表的想法(也许使用硬盘驱动器而不是内存)。

有一篇有趣的文章, 生成没有排序的排序随机整数? O(n)表示,您可以对指数随机增量进行求和,而不是生成统一的随机整数,从而为您提供按排序顺序生成的统一随机结果。

不能保证准确给出所需的样本数量,但应该非常接近,并且需要更快/更低的内存需求。

编辑:我发现了第二个帖子, 生成不涉及幂运算的排序随机数? 这建议您在进行分布时调整分布密度以生成准确数量的样本,但是我对这将对您的“均匀”分布产生的影响完全持怀疑态度。

Edit2:我发生的另一种可能性是使用逆累积二项分布来迭代划分样本范围(预测有多少均匀生成的随机样本将落在该范围的下半部,那么其余部分必须在上半部),直到块大小达到可以轻松保存在内存中的大小为止。

这是没有替换的标准样品。 您不能将范围[0,3 * 10 ^ 9]划分为均等的范围,并且无法在每个bin中采样相同的数量。 而且,有30亿个相对较大,许多“即用型”代码仅处理32位整数,大约为20亿(+-)。 请仔细查看它们的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM