6

嗨,我想生成一些具有帕累托分布的随机数。我发现使用 numpy 可以做到这一点。但我不知道热塑造结果。例如,我想在范围内得到结果:10-20,但我该如何实现呢?

我知道从 numpy 使用 pareto 的语法

numpy.random.pareto(m, s)

我不明白 m 是干什么用的(我一直在看维基百科,但我一点也不明白)?我知道生成的元组的大小。

4

3 回答 3

13

文档似乎有一个错误,可能会让您感到困惑。

通常调用签名中的参数名称:

numpy.random.pareto(a, size=None)

将参数名称与给定的详细信息匹配:

Parameters
----------
shape : float, > 0.
    Shape of the distribution.
size : tuple of ints
    Output shape.  If the given shape is, e.g., ``(m, n, k)``, then
    ``m * n * k`` samples are drawn.

但是您会看到第一个参数同时被称为aand shape。将您想要的形状作为第一个参数传递给函数以获取size数字的分布(它们不是 a tuple,而是 numpy array)。

如果您需要更改第二个参数(在wikipedia上称为 x m),则只需将其添加到所有值中,如文档中的示例所示:

Examples
--------
Draw samples from the distribution:

>>> a, m = 3., 1. # shape and mode
>>> s = np.random.pareto(a, 1000) + m

因此,实现下限是微不足道的:只需将下限用于m

lower = 10  # the lower bound for your values
shape = 1   # the distribution shape parameter, also known as `a` or `alpha`
size = 1000 # the size of your sample (number of random values)

并创建具有下限的分布:

x = np.random.pareto(shape, size) + lower

但是,Pareto 分布不受上界限制,因此如果您尝试将其截断,它实际上将是分布的截断版本,这并不完全相同,所以要小心。如果形状参数远大于 1,则分布会以代数方式衰减,如 x – (a+1),因此无论如何您都不会看到很多大值。

如果您选择实现上限,一种简单的方法是生成普通样本,然后删除任何超出限制的值:

upper = 20
x = x[x<upper]  # only values where x < upper

但是现在您的样本大小(可能)更小了。您可以继续添加新的(并过滤掉太大的值),直到大小达到您想要的大小,但是首先使其足够大,然后只使用size它们会更简单:

x = np.random.pareto(shape, size*5/4) + lower
x = x[x<upper][:size]
于 2013-10-22T19:58:17.413 回答
1

@askewchan 文档是否已更改?

根据最新的文档m应该这样使用

a, m = 3., 2.  # shape and mode
s = (np.random.pareto(a) + 1) * m

其中a是形状,m是比例(在维基百科中是 (x m ))。

这是测试代码,预期均值等于模拟结果。

a = 2
m = 10

def subtask_service_time():
    return (numpy.random.pareto(a) + 1) * m

print('Simulation mean:', sum([subtask_service_time() for _ in range(1000)]) / 1000)
print('Excepted mean:', a * m / (a - 1))

>>>>Simulation mean: 20.383399962437686
>>>>Excepted mean: 20.0
于 2016-05-16T10:16:01.280 回答
0

生成器不提供版本兼容性保证。

您可以使用numpy.random.Generator.pareto在 Numpy 1.18.1 中生成数字

例如:

a, m = 3., 2.  # shape and mode
s = (np.random.default_rng().pareto(a, 1000) + 1) * m

在帕累托分布中,众数也意味着下限。并且帕累托分布没有上限

形状可以通过 Shape = E / (E - mode) 来计算

于 2020-02-04T09:33:44.873 回答