答案 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或对值的不切实际的期望)。我认为让计算机完成工作是有效的,或者从一些合理的选择中手工挑选最佳选择。