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

tob*_*obi 5 python random numpy

嗨我想用帕累托分布生成一些随机数.我发现这可能是使用numpy.但我不知道如何塑造结果.例如,我希望结果范围:10-20,但我怎样才能实现这一目标?

我知道从numpy使用pareto的语法

numpy.random.pareto(m, s)
Run Code Online (Sandbox Code Playgroud)

我无法理解m是什么(我一直在寻找维基百科,但我不明白一点)?我知道生成元组的si大小.

ask*_*han 10

文件似乎有一个错误,这可能是混淆你.

通常是呼叫签名中的参数名称:

numpy.random.pareto(a, size=None)
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

但是你看到第一个参数被称为ashape.将您想要的形状作为函数的第一个参数传递,以获得size数字的分布(它们不是a tuple,而是numpy array).

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

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

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

因此,实现下限是微不足道的:只需使用下限即可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)
Run Code Online (Sandbox Code Playgroud)

并创建具有下限的分布:

x = np.random.pareto(shape, size) + lower
Run Code Online (Sandbox Code Playgroud)

但是,帕累托分布不是从上面限制的,所以如果你试图将其剪掉,那么它实际上将是分布的截断版本,这不是一回事,所以要小心.如果形状参数远大于1,则分布以代数方式衰减,如x - (a + 1),因此无论如何您都不会看到很多大值.

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

upper = 20
x = x[x<upper]  # only values where x < upper
Run Code Online (Sandbox Code Playgroud)

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

x = np.random.pareto(shape, size*5/4) + lower
x = x[x<upper][:size]
Run Code Online (Sandbox Code Playgroud)