在Python中如何使用pareto分布生成特定范围内的随机数

2024-10-06 13:39:44 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我想用帕累托分布生成一些随机数。我发现使用numpy是可能的。但我不知道如何影响结果。例如,我想得到的结果范围是:10-20,但我如何才能实现这一点呢?在

我知道从numpy使用pareto的语法

numpy.random.pareto(m, s)

我不明白m是什么意思(我已经在维基百科上查过了,但我一点也不懂)?我知道生成的元组的大小。在


Tags: numpy语法random元组pareto
2条回答

documentation似乎有个错误,可能会让您困惑。在

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

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

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

^{pr2}$

但是您可以看到第一个参数同时被称为a和{}。将所需的shape作为函数的第一个参数,以获得size数的分布(它们不是tuple,而是一个numpyarray)。在

如果需要更改第二个参数(在wikipedia上称为xm),那么只需将其添加到所有值中,如docs中的示例所示:

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

然而,帕累托分布并不是从上面有界的,所以如果你试图切断它,它实际上是分布的truncated version,这不是完全一样的事情,所以要小心。如果形状参数远大于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]

@askewchan文件更改了吗?在

根据最新的docm应该这样使用

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

其中a是形状,m是比例(在Wikipedia中是(xm)。在

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

^{pr2}$

相关问题 更多 >