0

我想创建一个范围为 [0, 1000] 的 Zipf 分布式值数组。

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

我怎样才能做到这一点?

4

2 回答 2

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 的重点不是值的范围是生成值数量的函数吗?

于 2012-12-06T03:25:04.503 回答
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 每次都出现在什么地方。为了清楚起见,我省略了一些条件检查、排序等。

但是,如果您必须执行多次(即您必须运行 for 循环 100 万次才能获得您的分布),您可能有问题(例如 alpha,或对值的不切实际的期望)。我觉得“让计算机完成工作”或从几个合理的选项中挑选最佳选项是有效的。

于 2014-08-18T20:31:47.217 回答