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.random
和 scipy.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 < b
和 g != 0
。对于 a=0
、b=1
和 g > 0
,这些公式应与 numpy.power
和 scipy.stats.powerlaw
一致。
我想从具有负指数 (a = -2) 的幂律分布中绘制一个 2 到 15 之间的随机变量。我发现以下内容:
r = scipy.stats.powerlaw.rvs(a, loc = 2, scale = 13, size = 1000)
但是a不取负数。
有人知道出路吗?
numpy.random
和 scipy.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 < b
和 g != 0
。对于 a=0
、b=1
和 g > 0
,这些公式应与 numpy.power
和 scipy.stats.powerlaw
一致。