首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python :从幂律分布生成随机数

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

Stack Overflow用户
提问于 2015-06-29 11:20:05
回答 1查看 9.5K关注 0票数 5

我想从负指数(a = -2)的幂律分布中画出一个2到15之间的随机变量。我发现了以下情况:

代码语言:javascript
复制
r = scipy.stats.powerlaw.rvs(a, loc = 2, scale = 13, size = 1000)

但它不需要负数作为a。

有人知道出路吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-29 13:55:24

numpy.randomscipy.stats中定义的幂律分布在数学意义上没有被定义为负a,这在this question的答案中已经解释过了:由于在零的奇异性,它们是不可标准化的。所以,可悲的是,数学说“不”。

你可以定义一个与x^{g-1}成比例的分布,它与g < 0成比例,间隔不包含零,如果这就是你想要的。

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

代码语言:javascript
复制
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)

然后你就可以,例如,

代码语言:javascript
复制
In [4]: xx = rndm(1, 2, g=-2, size=10000)

诸若此类。

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

代码语言:javascript
复制
In [5]: def pdf(x, a, b, g):
    ag, bg = a**g, b**g
   ....:     return g * x**(g-1) / (bg - ag)

这一切都假定a < bg != 0。这些公式应与numpy.powerscipy.stats.powerlawa=0b=1g > 0相一致。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31114330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档