2012-12-06 49 views

回答

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的全部要點,值的範圍是生成的值的數量的函數?

2

我同意原始答案(菲利克斯)強迫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或者對數值的不切實際的期望) 。我覺得'讓計算機做好工作'是合理的,或者從幾個合理的方面手工挑選最佳選擇。

相關問題