我想从负指数(a = -2)的幂律分布中画出一个2到15之间的随机变量。我发现了以下情况:
r = scipy.stats.powerlaw.rvs(a, loc = 2, scale = 13, size = 1000)但它不需要负数作为a。
有人知道出路吗?
发布于 2015-06-29 13:55:24
在numpy.random和scipy.stats中定义的幂律分布在数学意义上没有被定义为负a,这在this question的答案中已经解释过了:由于在零的奇异性,它们是不可标准化的。所以,可悲的是,数学说“不”。
你可以定义一个与x^{g-1}成比例的分布,它与g < 0成比例,间隔不包含零,如果这就是你想要的。
对于pdf(x) = const * x**(g-1) For 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。这些公式应与numpy.power和scipy.stats.powerlaw的a=0、b=1和g > 0相一致。
https://stackoverflow.com/questions/31114330
复制相似问题