numpy.random.Generator.multivariate_hypergeometric#

方法

random.Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals')#

從多元超幾何分布中生成變量。

多元超幾何分布是超幾何分布的推廣。

從一個包含 N 種不同類型的集合中,隨機且不放回地選擇 nsample 個項目。Ncolors 的長度,而 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]]])