如何在Python中使用范围n从Zipf Distribution创建值?

时间:2012-12-06 02:42:45

标签: python numpy distribution

我想创建一个Zipf Distributed值数组,范围为[0,1000]。

我正在使用numpy.random.zipf来创建值,但我无法在我想要的范围内创建它们。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

标准化并乘以1000?

a=2
s = np.random.zipf(a, 1000)
result = (s/float(max(s)))*1000

print min(s), max(s)
print min(result), max(result)

虽然不是zipf的全部要点,值的范围是生成的值的数量的函数?

答案 1 :(得分:2)

我同意最初的答案(Felix),强制Zipf值到特定范围是一件非常不寻常的事情,这可能意味着你做错了。

话虽如此,我实际上遇到了类似的问题,我确实需要生成符合某个标准的Zipf值。在我的例子中,我想生成一个类似于现有数据集的全新数据集。我希望总和与现有分布相同,但值不同。

我的见解是,在您获得自己喜欢的值之前,可以重新生成几次值。

#Generate a quantity of Zipf-distributed values close to a desired sum 
def gen_zipf_values(alpha, sum, quantity):
    best = []
    best_sum = 0
    for _ in range(10):
        s = np.random.zipf(alpha,quantity)
        this_sum = s.sum()
        if (this_sum > best_sum) and (this_sum <= sum):
            best = s
            best_sum=this_sum
    return best

同样,这个解决方案是根据我的问题量身定制的,我希望生成接近总和的值,而无需重复。我也非常清楚每次想要alpha的内容。为了清楚起见,我省略了一些条件检查,排序等。

如果你不得不多次这样做(即你必须运行100万次for循环来获得你的发行版),你可能有些错误(比如alpha或对值的不切实际的期望)。我认为让计算机完成工作是有效的,或者从一些合理的选择中手工挑选最佳选择。