【问题标题】:Generate random numbers distributed by Zipf生成由 Zipf 分发的随机数
【发布时间】:2010-11-24 22:00:26
【问题描述】:

Zipf probability distribution 通常用于模拟 P2P 系统中项目的文件大小分布或项目访问分布。例如"Web Caching and Zip like Distribution Evidence and Implications",但 BoostGSL (Gnu Scientific Library) 均未提供使用此分布生成随机数的实现。我没有找到使用通用搜索引擎的(值得信赖的)实现。

如何使用 U(0,1) 随机生成器根据 Zipf 分布分布的随机数,例如Mersenne twister?

【问题讨论】:

  • 最近的一篇论文 (Maurizio Naldi, 2015) 提出了一种近似算法,该算法具有一个权衡时间和准确性的参数。对于合理的 alpha 范围(0 arxiv.org/pdf/1511.01480.pdf

标签: math random probability


【解决方案1】:

这是一个类似于 Python Zipf 的分布生成器,用于带有参数 alpha >= 0n 项目:

import random 
import bisect 
import math 

class ZipfGenerator: 

    def __init__(self, n, alpha): 
        # Calculate Zeta values from 1 to n: 
        tmp = [1. / (math.pow(float(i), alpha)) for i in range(1, n+1)] 
        zeta = reduce(lambda sums, x: sums + [sums[-1] + x], tmp, [0]) 

        # Store the translation map: 
        self.distMap = [x / zeta[-1] for x in zeta] 

    def next(self): 
        # Take a uniform 0-1 pseudo-random value: 
        u = random.random()  

        # Translate the Zipf variable: 
        return bisect.bisect(self.distMap, u) - 1

【讨论】:

  • 优秀的答案。对于 Python 3.x,添加“from functools import *”
  • 或者,from functools import reduce
  • self.distMap = [math.pow(float(x), alpha) / zeta[-1] for x in zeta]
【解决方案2】:

zipfR 是一个使用 R 实现的免费开源库。VGAM 是另一个同样实现 Zipf 的 R 包。

还值得注意的是,Gnu Scientific Library 有一个 implementationPareto distribution,这实际上是离散 Zipf 分布的连续模拟。

此外,Zeta distribution 等效于 Zipf 用于无限 N。 GSL 有一个 implementationRiemann zeta function,因此您可以使用它来自己构建分发。

【讨论】:

  • +1 表示 VGAM。它的dzipf 函数将为您提供每个等级的概率列表,您可以使用它来生成项目访问。
【解决方案3】:

numpy.random.zipf 使用 python 生成 Zipf 样本。

【讨论】:

  • 不幸的是,它使用了黎曼的 zeta 函数,所以它只需要大于 1 的指数,而许多 P2P 群体最好用指数低于 1 来建模。
【解决方案4】:

最近为 Apache Commons Math 库的下一个版本 (>= 3.6) 开发了一种非常有效的算法来生成 Zipf 分布式随机变量(参见代码 here)。它利用拒绝反转采样,也适用于小于 1 的指数。它不需要预先计算 CDF 并将其保存在内存中。此外,生成一个样本的成本是恒定的,不会随着项目的数量而增加。

【讨论】:

    【解决方案5】:

    我们在this thread 中讨论了@stanga 的答案。他的算法有一些不错的优化建议。

    【讨论】:

    • 目前这几乎没有通过答案。您应该在此处包含您的解决方案,而不仅仅是参考它。
    猜你喜欢
    • 2017-05-17
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多