我正在從負二項式分布 (nbd) 中生成一組隨機選擇的總和,每個總和的長度都是不規則的。現在我實作它如下:
import numpy
from numpy.random import default_rng
rng = default_rng()
nbd = rng.negative_binomial(1, 0.5, int(1e6))
gmc = [12, 35, 4, 67, 2]
n_pp = np.empty(len(gmc))
for i in range(len(gmc)):
n_pp[i] = np.sum(rng.choice(nbd, gmc[i]))
這是有效的,但是當我在我的實際資料上執行它時它非常慢(gmc 的維度為 1e6),我想改變 nbd 中 n 和 p 的多個值(在本例中它們設定為 1和 0.5,分別)。
我想找出一種 pythonic 方法來消除回圈,但我不確定這是否可能。如果可能的話,我想保留 default_rng 以獲得比舊的方法(np.random.choice)更好的隨機生成。
uj5u.com熱心網友回復:
m來自帶引數(n, p)的負二項式分布的樣本總和的分布是帶引數的負二項式分布(m*n, p)。因此negative_binomial(1, 0.5),您可以直接使用negative_binomial(gmc, 0.5)以下命令生成結果,而不是從 的大型預計算樣本中對隨機選擇求和:
In [68]: gmc = [12, 35, 4, 67, 2]
In [69]: npp = rng.negative_binomial(gmc, 0.5)
In [70]: npp
Out[70]: array([ 9, 34, 1, 72, 7])
(該negative_binomial方法將廣播其輸入,因此我們可以將其gmc作為引數傳遞以通過一次呼叫生成所有樣本。)
更一般地,如果您想改變n用于生成 的nbd,您可以將其乘以n相應的元素 ingmc并將乘積傳遞給rng.negative_binomial。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/361985.html
