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

Pan*_*chi 3 python statistics numpy scipy

我想绘制一个2到15之间的随机变量,来自具有负指数(a = -2)的幂律分布.我找到了以下内容:

r = scipy.stats.powerlaw.rvs(a, loc = 2, scale = 13, size = 1000)
Run Code Online (Sandbox Code Playgroud)

但它并没有采取负数.

有人知道出路吗?

ev-*_*-br 11

如在该问题的答案中所解释的那样,在数学意义上定义的幂律分布numpy.random并且scipy.stats没有定义为负值:由于奇点为零,它们不可规范化.所以,遗憾的是,数学说'不'.a

您可以使用x^{g-1}g < 0不包含零的间隔成比例的pdf定义分布,如果这是您所追求的.

对于pdf(x) = const * x**(g-1)for a <= x <= b,从均匀variate(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)
Run Code Online (Sandbox Code Playgroud)

然后,你可以这样做,例如,

In [4]: xx = rndm(1, 2, g=-2, size=10000)
Run Code Online (Sandbox Code Playgroud)

等等.

为完整起见,这里是pdf:

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

这一切都假设a < bg != 0.这些公式应该同意numpy.powerscipy.stats.powerlawfor a=0,b=1and g > 0