2013-10-22 64 views
4

您好我想用pareto分布生成一些随机数。我发现这是可能的使用numpy。但是,我不知道这个结果会很火。例如,我想要在范围内的结果:10-20,但我怎么能实现这一目标?如何在Python中使用pareto分布生成specyfic范围中的随机数

我知道用帕累托从numpy的

numpy.random.pareto(m, s) 

我不明白是什么M的语法(我一直在寻找在维基百科上,但我不明白一个位)?我知道这是我生成的元组的大小。

+1

RTFM? http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.pareto.html –

+0

你读过这个http://docs.scipy.org/doc/numpy/reference/generated/numpy。 random.pareto.html – darmat

+1

公平地说,文档中的参数是错误的。 – askewchan

回答

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. 

但是你看,第一个参数被称为既ashape。将想要的形状作为第一个参数传递给size号码(它们不是tuple,而是array)。

如果您需要更改第二个参数(名为xwikipedia),则只需将其添加到所有的值,如示例从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] 
+0

此建议似乎与维基百科有关Lomax与帕雷托关系的文章有冲突。文章说Lomax(比例,形状)+比例等于帕累托(比例=比例,形状)。这意味着帕累托分布不能从尺度参数不能设置的Lomax中获得。 –

+0

@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

0

@askewchan是否更改了文档?

根据最新docm应使用这样

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 
相关问题