您好我想生成一些带有帕累托分布的随机数。我发现这可能是使用numpy。但我不知道如何塑造结果。例如,我希望结果范围:10-20,但我怎样才能实现这一目标?
我知道从numpy
使用pareto的语法numpy.random.pareto(m, s)
我无法理解m是什么(我一直在寻找维基百科,但我不明白一点)?我知道生成元组的大小。
答案 0 :(得分:9)
documentation似乎有一个错误,可能让你感到困惑。
通常是呼叫签名中的参数名称:
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.
但是您看到第一个参数同时被称为a
和shape
。将您想要的形状作为函数的第一个参数传递,以获得size
个数字的分布(它们不是tuple
,而是一个numpy array
)
如果您需要更改第二个参数(在wikipedia上称为x m ),则只需将其添加到所有值,如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]
答案 1 :(得分:1)
@askewchan文件是否已更改?
根据最新的doc,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
答案 2 :(得分:0)
Generator不提供版本兼容性保证。
您可以使用 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
在pareto分发中,mode也表示下限。而且pareto分布没有上限
可以通过Shape = E /(E-模式)来计算形状