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

时间:2015-06-29 11:20:05

标签: python numpy statistics scipy

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

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

但它没有采取负数。

任何人都知道出路吗?

1 个答案:

答案 0 :(得分:11)

switch (ch) { case '+': cout<<"The sum of the two numbers is: "<<num1+num2<<endl; break; case '-'; cout<<num2<<" subtracted from "<<num1<<" is "<<num1-num2<<endl; break; case '*': cout<<"When multiplied: "<<num1*num2<<endl; break; case '/': cout<<num1<<" divided by "<<num2<<" will be "<<num1/num2<<endl; break; default: cout<<"Wrong input. Try again."; } Response.AppendHeader("Content-Disposition"," attachment; filename = " + Session["user_id"] + "_makler.pdf"); 中定义的幂律分布在数学意义上没有为负numpy.random定义,如this question的答案中所述:它们不可规范化因为零点处的奇点。所以,遗憾的是,数学说'不'。

您可以使用与scipy.stats成比例的pdf定义分布,其中a的间隔不包含零,如果这是您所追求的。

对于x^{g-1}的{​​{1}},来自统一变量(g < 0)的转换是:

pdf(x) = const * x**(g-1)

然后你可以做,例如,

a <= x <= b

等等。

为完整起见,这里是pdf:

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) 。这些公式应与In [5]: def pdf(x, a, b, g): ag, bg = a**g, b**g ....: return g * x**(g-1) / (bg - ag) a < bg != 0的{​​{1}}和numpy.power一致。