簡體   English   中英

np.random.choice:概率總和不為 1

[英]np.random.choice: probabilities do not sum to 1

我如何在這里使用 np.random.choice ? 有通過某種操作計算的p ,例如:

 p=[  1.42836755e-01,   1.42836735e-01  , 1.42836735e-01,   1.42836735e-01
,   4.76122449e-05,   1.42836735e-01  , 4.76122449e-05  , 1.42836735e-01,
   1.42836735e-01,   4.76122449e-05]

通常總和 p 不完全等於 1:

>>> sum(p)
1.0000000017347

我想通過概率 = p 進行隨機選擇:

>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)
array([4, 3, 2, 9])

這里的工作! 但在程序中它有一個錯誤:

Traceback (most recent call last):
    indexs=np.random.choice(range(len(population)), population_number, p=p, replace=False)
  File "mtrand.pyx", line 1141, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:17808)
ValueError: probabilities do not sum to 1

如果我打印p

[  4.17187500e-05   2.49937500e-01   4.16562500e-05   4.16562500e-05
   2.49937500e-01   4.16562500e-05   4.16562500e-05   4.16562500e-05
   2.49937500e-01   2.49937500e-01]

但它可以通過這個p在 python shell 中工作:

>>> p=[  4.17187500e-05 ,  2.49937500e-01   ,4.16562500e-05  , 4.16562500e-05,
   2.49937500e-01  , 4.16562500e-05  , 4.16562500e-05  , 4.16562500e-05,
   2.49937500e-01   ,2.49937500e-01]
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)
array([ 9, 10,  2,  5])

更新我已經通過 precision=15 對其進行了測試:

 np.set_printoptions(precision=15)
 print(p)
[  2.499375625000002e-01   2.499375000000000e-01   2.499375000000000e-01
   4.165625000000000e-05   4.165625000000000e-05   4.165625000000000e-05
   4.165625000000000e-05   4.165625000000000e-05   2.499375000000000e-01
   4.165625000000000e-05]

測試:

>>> p=np.array([  2.499375625000002e-01   ,2.499375000000000e-01   ,2.499375000000000e-01,
   4.165625000000000e-05   ,4.165625000000000e-05,   4.165625000000000e-05,
   4.165625000000000e-05  , 4.165625000000000e-05 ,  2.499375000000000e-01,
   4.165625000000000e-05])
>>> np.sum(p)
1.0000000000000002

如何解決這個問題以使用 np.random.choice ?

這是 numpy 的一個已知問題 隨機選擇函數使用給定的容差( 這里是源)檢查概率的總和

如果總和足夠接近 1,解決方案是通過將概率除以它們的總和來標准化概率

示例:

>>> p=[  1.42836755e-01,   1.42836735e-01  , 1.42836735e-01,   1.42836735e-01
,   4.76122449e-05,   1.42836735e-01  , 4.76122449e-05  , 1.42836735e-01,
   1.42836735e-01,   4.79122449e-05]
>>> sum(p) 
1.0000003017347 # over tolerance limit
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)

Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)
  File "mtrand.pyx", line 1417, in mtrand.RandomState.choice (numpy\random\mtrand\mtrand.c:15985)
ValueError: probabilities do not sum to 1

歸一化:

>>> p = np.array(p)
>>> p /= p.sum()  # normalize
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)
array([8, 4, 1, 6])

查看差異的一種方法是:

numpy.set_printoptions(precision=15)
print(p)

這可能會告訴你你的4.17187500e-05實際上是4.17187500005e-05 請參閱此處的手冊

將其轉換為 float64:

p = np.asarray(p).astype('float64')
p = p / np.sum(p)
np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)

這是受到另一篇文章的啟發: 使用 numpy.random.multinomial 時如何避免值錯誤?

ValueError:概率總和不為 1

這是一個已知的 numpy 錯誤。 當 numpy 無法足夠精確地處理浮點操作時會發生此錯誤。 有時,概率的總和等於 0.9999999999997 或 1.0000000000003。 他們會破壞 np.random.choice()。

有一個解決方法: np.random.multinomial() 這種方法可以更優雅地處理概率,而無需精確到 1.0。

pvals :浮點數序列,長度為 p 每種不同結果的概率。 這些總和應為 1(但是,只要 sum(pvals[:-1]) <= 1,則始終假定最后一個元素考慮剩余概率)。

例如,我有一些選擇和與選擇相關的 normalized_weights。

np.random.multinomial() 根據 normalized_weights 選擇 20 次並返回每個選擇被選擇的次數。

choices = [......]
weights = np.array([......])
normalized_weights = weights / np.sum(weights)

number_of_choices = 20
resample_counts = np.random.multinomial(number_of_choices,
                                        normalized_weights)

chosen = []
resample_index = 0
for resample_count in resample_counts:
    for _ in range(resample_count):
        chosen.append(choices[resample_index])
    resample_index += 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM