17

Zipf 概率分布通常用于对 P2P 系统中项目的文件大小分布或项目访问分布进行建模。例如“Web Caching and Zip like Distribution Evidence and Implications”,但BoostGS​​L(Gnu 科学图书馆)都没有提供使用此分布生成随机数的实现。我还没有找到使用通用搜索引擎的(值得信赖的)实现。

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

4

5 回答 5

12

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

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
于 2012-01-09T12:48:16.150 回答
11

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

还值得注意的是,Gnu 科学图书馆有一个帕累托分布的实现,它实际上是离散 Zipf 分布的连续模拟。

此外,对于无限N , Zeta 分布等效于 Zipf 。GSL 具有Riemann zeta 函数的实现,因此您可以使用它来自己构建分布。

于 2009-09-02T11:05:45.263 回答
10

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

于 2009-09-02T11:15:47.393 回答
4

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

于 2015-10-18T16:38:26.067 回答
0

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

于 2015-06-24T20:20:25.173 回答