我想为scipy.stats.powerlaw例程提供负指数,例如a = -1.5,以便绘制随机样本:
"""
powerlaw.pdf(x, a) = a * x**(a-1)
"""
from scipy.stats import powerlaw
R = powerlaw.rvs(a, size=100)
为什么是>如果需要0,我如何提供负数a以生成随机样本,以及如何提供归一化系数/变换,即
PDF(x,C,a) = C * x**a
文档在这里
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.powerlaw.html
谢谢!
编辑:我应该补充一点,我正在尝试复制IDL的RANDOMP功能:答案 0 :(得分:5)
在其域上集成的PDF必须等于一个。换句话说,概率密度函数曲线下的面积必须等于1。
In [36]: import scipy.integrate as integrate
In [40]: y, err = integrate.quad(lambda x: 0.5*x**(-0.5), 0, 1)
In [41]: y
Out[41]: 0.9999999999999998 # The integral is close to 1
powerlaw密度函数具有0 <= x <= 1的域。在该域上,x**b
的积分对于任何b
&gt;是有限的。 -1。当b
较小时,x**b
会在x = 0
附近过快地爆炸。因此,b <= -1
时它不是有效的概率密度函数。
In [38]: integrate.quad(lambda x: x**(-1), 0, 1)
UserWarning: The maximum number of subdivisions (50) has been achieved...
# The integral blows up
因此对于x**(a-1)
,a
必须满足a-1 > -1
或等效a > 0
。
a
中的第一个常量a * x**(a-1)
是规范化常量,它使a * x**(a-1)
在域[0,1]上的积分等于1.所以你没有达到选择此常量独立于a
。
现在,如果您将域更改为距离0可测量的距离,那么您可以为负C * x**a
定义a
形式的PDF。但是你必须说明你想要的域名,我认为scipy.stats
中没有(现在)可用的PDF。
答案 1 :(得分:2)
如果r是均匀随机偏离U(0,1),则下面表达式中的x是幂律分布随机偏差:
x = xmin * (1-r) ** (-1/(alpha-1))
其中xmin是幂律分布所在的最小(正)值,而alpha是分布的指数。
答案 2 :(得分:1)
Python包powerlaw可以做到这一点。考虑a>1
具有概率密度函数的幂律分布
f(x) = c * x^(-a)
代表x > x_min
和f(x) = 0
。此处c
是归一化因子,并确定为
c = (a-1) * x_min^(a-1).
在下面的示例中,它是a = 1.5
和x_min = 1.0
,并将从随机样本估计的概率密度函数与上面表达式中的PDF进行比较,得出预期结果。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as pl
import numpy as np
import powerlaw
a, xmin = 1.5, 1.0
N = 10000
# generates random variates of power law distribution
vrs = powerlaw.Power_Law(xmin=xmin, parameters=[a]).generate_random(N)
# plotting the PDF estimated from variates
bin_min, bin_max = np.min(vrs), np.max(vrs)
bins = 10**(np.linspace(np.log10(bin_min), np.log10(bin_max), 100))
counts, edges = np.histogram(vrs, bins, density=True)
centers = (edges[1:] + edges[:-1])/2.
# plotting the expected PDF
xs = np.linspace(bin_min, bin_max, 100000)
pl.plot(xs, [(a-1)*xmin**(a-1)*x**(-a) for x in xs], color='red')
pl.plot(centers, counts, '.')
pl.xscale('log')
pl.yscale('log')
pl.savefig('powerlaw_variates.png')
返回
答案 3 :(得分:0)
如果要生成幂律分布,可以使用随机偏差。您只需要在[0,1]之间生成一个随机数并应用反向方法(Wolfran)。在这种情况下,概率密度函数是:
p(k)= k ^( - gamma)
和 y 是0到1之间的变量统一。
y~U(0,1)
import numpy as np
def power_law(k_min, k_max, y, gamma):
return ((k_max**(-gamma+1) - k_min**(-gamma+1))*y + k_min**(-gamma+1.0))**1.0/(-gamma + 1.0)
现在要生成分发,您只需要创建一个数组
nodes = 1000
scale_free_distribution = np.zeros(nodes, float)
k_min = 1.0
k_max = 100*k_min
gamma = 3.0
for n in range(nodes):
scale_free_distribution[n] = power_law(k_min, k_max,np.random.uniform(0,1), gamma)
这将产生伽马= 3.0的幂律分布,如果你想要确定分布的平均值,你必须研究Complex Networks因为k_min取决于k_max和平均锥度。
答案 4 :(得分:0)
我的答案与上述维吉尔(Virgil)的答案几乎相同,但关键的区别在于alpha实际上是幂律分布的负指数
因此,如果r是均匀随机偏差U(0,1),则以下表达式中的x是幂律分布随机偏差:
x = xmin * (1-r) ** (-1/(alpha-1))
其中xmin是幂律分布所在的最小(正)值,而alpha是分布的负指数,即P(x)= [常数] * x **-alpha