您好我想用pareto分布生成一些随机数。我发现这是可能的使用numpy。但是,我不知道这个结果会很火。例如,我想要在范围内的结果:10-20,但我怎么能实现这一目标?如何在Python中使用pareto分布生成specyfic范围中的随机数
我知道用帕累托从numpy的
numpy.random.pareto(m, s)
我不明白是什么M的语法(我一直在寻找在维基百科上,但我不明白一个位)?我知道这是我生成的元组的大小。
您好我想用pareto分布生成一些随机数。我发现这是可能的使用numpy。但是,我不知道这个结果会很火。例如,我想要在范围内的结果:10-20,但我怎么能实现这一目标?如何在Python中使用pareto分布生成specyfic范围中的随机数
我知道用帕累托从numpy的
numpy.random.pareto(m, s)
我不明白是什么M的语法(我一直在寻找在维基百科上,但我不明白一个位)?我知道这是我生成的元组的大小。
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
,而是array
)。
如果您需要更改第二个参数(名为x米上wikipedia),则只需将其添加到所有的值,如示例从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)
并创建th与下界E分布:
x = np.random.pareto(shape, size) + lower
然而,帕累托分布不上界,因此,如果你试图把它割下它真的会分布的truncated version,这是不太一样的东西,所以要小心。如果形状参数远大于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]
此建议似乎与维基百科有关Lomax与帕雷托关系的文章有冲突。文章说Lomax(比例,形状)+比例等于帕累托(比例=比例,形状)。这意味着帕累托分布不能从尺度参数不能设置的Lomax中获得。 –
@Artturi,我不是这方面的专家,但我认为你是对的。我会这样说:* lomax(loc,scale,shape)* = * pareto_ii(loc,scale,shape)* = * pareto_i(loc = scale,shape)*,最后一个等式只有在* loc =规模*。 * pareto_ii *(和* lomax *)是* pareto_i *的泛化,其中分布由* loc *移位,因此您可以将* loc *添加到每个值。我相信'np.random.pareto(shape)+ loc' = * lomax(loc,scale = 1,shape)*。我想我上面的答案仍然成立,你不能从1改变比例。 – askewchan
@askewchan是否更改了文档?
根据最新doc,m
应使用这样
a, m = 3., 2. # shape and mode
s = (np.random.pareto(a) + 1) * m
其中a
是形状,并且m
是比例(其为(x米)在维基百科)。
这是测试代码,预期的平均值等于模拟结果。
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
RTFM? http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.pareto.html –
你读过这个http://docs.scipy.org/doc/numpy/reference/generated/numpy。 random.pareto.html – darmat
公平地说,文档中的参数是错误的。 – askewchan