Python 随机库:根据帕累托分布进行模拟(使用形状和尺度参数)

问题描述 投票:0回答:2

根据Python文档,random.paretovariate(alpha)模拟帕累托分布,其中alpha是形状参数。但帕累托分布同时具有形状和尺度参数。

如何从指定两个参数的分布中进行模拟?

python statistics
2个回答
0
投票

您可以使用 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()

Graph


0
投票

如果我们看一下来源,我们可以看到他们是如何做到的:

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)

© www.soinside.com 2019 - 2024. All rights reserved.