numpy.random.Generator.multivariate_hypergeometric#
方法
- random.Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals')#
從多元超幾何分布中生成變量。
多元超幾何分布是超幾何分布的推廣。
從一個包含
N
種不同類型的集合中,隨機且不放回地選擇nsample
個項目。N
是colors
的長度,而colors
中的值是該類型在集合中出現的次數。集合中項目的總數為sum(colors)
。此函數生成的每個隨機變量都是一個長度為N
的向量,其中包含在nsample
個項目中出現的不同類型的計數。名稱
colors
來自對分布的常見描述:它是從一個裝有不同顏色彈珠的罐子中,不放回地選取每種顏色彈珠數量的機率分布;colors[i]
是罐子中顏色i
的彈珠數量。- 參數:
- colors整數序列
集合中每種類型項目的數量,樣本即從此集合中抽取。
colors
中的值必須是非負數。為了避免演算法中精度損失,當 method 為 “marginals” 時,sum(colors)
必須小於10**9
。- nsample整數
選取的項目數量。
nsample
不得大於sum(colors)
。- size整數或整數元組,可選
要生成的變量數量,可以是整數或元組,用於指定變量陣列的形狀。如果給定的 size 例如是
(k, m)
,則會抽取k * m
個變量,其中一個變量是長度為len(colors)
的向量,且回傳值的形狀為(k, m, len(colors))
。如果size
是一個整數,則輸出形狀為(size, len(colors))
。預設值為 None,在這種情況下,將返回一個形狀為(len(colors),)
的陣列作為單個變量。- method字串,可選
指定用於生成變量的演算法。必須是 ‘count’ 或 ‘marginals’ (預設值)。 有關方法的描述,請參閱「Notes」章節。
- 返回:
- variatesndarray
從多元超幾何分布中抽取的變量陣列。
參見
hypergeometric
從(單變量)超幾何分布中抽取樣本。
註解
這兩種方法不會返回相同的變量序列。
“count” 演算法大致等同於以下 NumPy 程式碼
choices = np.repeat(np.arange(len(colors)), colors) selection = np.random.choice(choices, nsample, replace=False) variate = np.bincount(selection, minlength=len(colors))
“count” 演算法使用一個長度為
sum(colors)
的整數暫存陣列。“marginals” 演算法透過重複調用單變量超幾何取樣器來生成變量。它大致等同於
variate = np.zeros(len(colors), dtype=np.int64) # `remaining` is the cumulative sum of `colors` from the last # element to the first; e.g. if `colors` is [3, 1, 5], then # `remaining` is [9, 6, 5]. remaining = np.cumsum(colors[::-1])[::-1] for i in range(len(colors)-1): if nsample < 1: break variate[i] = hypergeometric(colors[i], remaining[i+1], nsample) nsample -= variate[i] variate[-1] = nsample
預設方法是 “marginals”。在某些情況下(例如,當 colors 包含相對較小的整數時),“count” 方法可能比 “marginals” 方法快得多。如果演算法的效能很重要,請使用典型的輸入測試這兩種方法,以決定哪種方法最有效。
範例
>>> colors = [16, 8, 4] >>> seed = 4861946401452 >>> gen = np.random.Generator(np.random.PCG64(seed)) >>> gen.multivariate_hypergeometric(colors, 6) array([5, 0, 1]) >>> gen.multivariate_hypergeometric(colors, 6, size=3) array([[5, 0, 1], [2, 2, 2], [3, 3, 0]]) >>> gen.multivariate_hypergeometric(colors, 6, size=(2, 2)) array([[[3, 2, 1], [3, 2, 1]], [[4, 1, 1], [3, 2, 1]]])