根据Python文档,random.paretovariate(alpha)模拟帕累托分布,其中alpha是形状参数。但帕累托分布同时具有形状和尺度参数。
如何从指定两个参数的分布中进行模拟?
您可以使用 NumPy 代替:
from numpy import random
pareto = random.pareto(a=4, size=(4, 8))
print(pareto)
>>>[[0.32803729 0.03626127 0.73736579 0.53301595 0.33443536 0.12561402
0.00816275 0.0134468 ]
[0.21536643 0.15798882 0.52957712 0.06631794 0.03728101 0.80383849
0.01727098 0.03910042]
[0.24481661 0.13497905 0.00665971 0.41875676 0.20252262 0.13701287
0.06929994 0.05350275]
[0.93898544 0.02621125 0.0873763 0.15660287 0.31329102 3.95332518
0.09149938 0.08415795]]
您还可以使用
matplotlib
和 seaborn
很好地绘制数据图表:
from numpy import random
import matplotlib.pyplot as plt
import seaborn
seaborn.distplot(random.pareto(a=4, size=1000), kde=False)
plt.show()
如果我们看一下来源,我们可以看到他们是如何做到的:
def paretovariate(self, alpha):
"""Pareto distribution. alpha is the shape parameter."""
# Jain, pg. 495
u = 1.0 - self.random()
return u ** (-1.0 / alpha)
self.random()
只是一个介于 0 和 1 之间的均匀分布的随机数。如果我们称之为 x
,他们正在计算 (1 - x) ^ (-1 / a)
。
他们正在做的是逆变换采样,技术非常简单:将均匀分布的随机数插入到 CDF 的逆中。
让我们看一下 帕累托分布的 CDF:
1 - (s / x) ^ a
为了清楚起见,我将比例参数称为
s
; a
是阿尔法。
一点代数可以让我们得到相反的结果:
s * (1 - x) ^ (-1 / a)
如果您注意到这正是
paretovariate
函数正在执行的操作(除了 times s
),那么您就是对的。
因此,你的答案是
scale * paretovariate(alpha)
。