Python : 从幂律分布生成随机数

Python : generating random numbers from a power law distribution

我想从具有负指数 (a = -2) 的幂律分布中绘制一个 2 到 15 之间的随机变量。我发现以下内容:

r = scipy.stats.powerlaw.rvs(a, loc = 2, scale = 13, size = 1000)

但是a不取负数。

有人知道出路吗?

numpy.randomscipy.stats 中定义的幂律分布在 this question 的答案中解释的数学意义上的负 a 未定义:它们是不可归一化,因为奇点为零。所以,可悲的是,数学表明 'no'.

您可以定义一个分布,pdf 与 x^{g-1} 成比例,g < 0 在不包含零的区间上,如果这就是您所追求的。

对于 pdf(x) = const * x**(g-1) 对于 a <= x <= b,统一变量 (np.random.random) 的转换是:

In [3]: def rndm(a, b, g, size=1):
    """Power-law gen for pdf(x)\propto x^{g-1} for a<=x<=b"""
   ...:     r = np.random.random(size=size)
   ...:     ag, bg = a**g, b**g
   ...:     return (ag + (bg - ag)*r)**(1./g)

然后你可以做,例如,

In [4]: xx = rndm(1, 2, g=-2, size=10000)

等等。

为了完整起见,这里是 pdf:

In [5]: def pdf(x, a, b, g):
    ag, bg = a**g, b**g
   ....:     return g * x**(g-1) / (bg - ag)

这一切都假设 a < bg != 0。对于 a=0b=1g > 0,这些公式应与 numpy.powerscipy.stats.powerlaw 一致。