我同意最初的答案(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,或者对值的不切实际的期望)。我觉得“让电脑来做这件事”或者从一些合理的选择中挑选出最好的选择是正确的。在