【问题标题】:Sampling from a huge uniform distribution in Python从 Python 中巨大的均匀分布中采样
【发布时间】:2014-02-05 19:26:05
【问题描述】:

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

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

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

由于我在实现更强大的东西时遇到了麻烦,我想知道您是否有其他想法来从大型离散制服中采样唯一值。我正在寻找关于如何直接管理非常大的列表(可能使用硬盘而不是内存)的算法、模块或想法。

【问题讨论】:

  • Numpy 是一个不错的选择。您可以将值直接放入 numpy 数组中,而不是先放入 Python 列表中。您真的需要硬盘驱动器还是有 3GB 内存?

标签: python memory sampling uniform


【解决方案1】:

有一篇有趣的帖子 Generating sorted random ints without the sort? O(n) 建议您可以对指数随机增量进行运行求和,而不是生成统一的随机整数,这会为您提供按排序顺序生成的统一随机结果。

不能保证准确提供您想要的样本数量,但应该非常接近,并且更快/更低的内存要求。

编辑:我发现了第二个帖子,generating sorted random numbers without exponentiation involved?,它建议在生成准确数量的样本时调整分布密度,但我对这究竟会做什么持怀疑态度你的“统一”分布。

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

【讨论】:

    【解决方案2】:

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

    【讨论】: