numpy.random.Generator.multinomial#

方法

random.Generator.multinomial(n, pvals, size=None)#

從多項式分佈中抽取樣本。

多項式分佈是二項式分佈的多元推廣。考慮一個實驗,其有 p 個可能的結果之一。此類實驗的一個範例是擲骰子,其結果可能是 1 到 6。從分佈中抽取的每個樣本代表 n 個此類實驗。其值 X_i = [X_0, X_1, ..., X_p] 表示結果為 i 的次數。

參數:
n整數或類似陣列的整數

實驗次數。

pvals類似陣列的浮點數

每個 p 個不同結果的機率,形狀為 (k0, k1, ..., kn, p)。每個元素 pvals[i,j,...,:] 必須總和為 1 (但是,只要 sum(pvals[..., :-1], axis=-1) <= 1.0,則始終假設最後一個元素會計入剩餘機率)。必須至少有 1 個維度,其中 pvals.shape[-1] > 0。

size整數或整數元組,選用

輸出形狀。如果給定的形狀為,例如,(m, n, k),則會抽取 m * n * k 個樣本,每個樣本具有 p 個元素。預設值為 None,其中輸出大小由 n 的廣播形狀以及 pvals 的最終維度決定,後者表示為 b=(b0, b1, ..., bq)。如果 size 不是 None,則它必須與廣播形狀 b 相容。具體而言,size 必須具有 q 個或更多元素,且 size[-(q-j):] 必須等於 bj

傳回:
outndarray(多維陣列)

抽取的樣本,如果提供,則形狀為 size。當提供 size 時,輸出形狀為 size + (p,)。如果未指定,則形狀由 npvals 的廣播形狀 (b0, b1, ..., bq) 決定,並以多項式的維度 p 擴增,因此輸出形狀為 (b0, b1, ..., bq, p)

每個條目 out[i,j,...,:] 都是從分佈中抽取的 p 維值。

範例

擲骰子 20 次

>>> rng = np.random.default_rng()
>>> rng.multinomial(20, [1/6.]*6, size=1)
array([[4, 1, 7, 5, 2, 1]])  # random

它落在 1 的次數為 4 次,落在 2 的次數為 1 次,依此類推。

現在,擲骰子 20 次,再擲 20 次

>>> rng.multinomial(20, [1/6.]*6, size=2)
array([[3, 4, 3, 3, 4, 3],
       [2, 4, 3, 4, 0, 7]])  # random

對於第一次執行,我們擲出 1 的次數為 3 次,2 的次數為 4 次,依此類推。對於第二次,我們擲出 1 的次數為 2 次,2 的次數為 4 次,依此類推。

現在,進行一個實驗,擲骰子 10 次,再擲 10 次,另一個實驗擲骰子 20 次,再擲 20 次

>>> rng.multinomial([[10], [20]], [1/6.]*6, size=(2, 2))
array([[[2, 4, 0, 1, 2, 1],
        [1, 3, 0, 3, 1, 2]],
       [[1, 4, 4, 4, 4, 3],
        [3, 3, 2, 5, 5, 2]]])  # random

第一個陣列顯示擲骰子 10 次的結果,第二個陣列顯示擲骰子 20 次的結果。

灌鉛骰子更可能停在數字 6 上

>>> rng.multinomial(100, [1/7.]*5 + [2/7.])
array([11, 16, 14, 17, 16, 26])  # random

模擬擲 10 次 4 面骰子和擲 20 次 6 面骰子

>>> rng.multinomial([10, 20],[[1/4]*4 + [0]*2, [1/6]*6])
array([[2, 1, 4, 3, 0, 0],
       [3, 3, 3, 6, 1, 4]], dtype=int64)  # random

從兩個類別產生類別隨機變數,其中第一個類別有 3 個結果,第二個類別有 2 個。

>>> rng.multinomial(1, [[.1, .5, .4 ], [.3, .7, .0]])
array([[0, 0, 1],
       [0, 1, 0]], dtype=int64)  # random

argmax(axis=-1) 接著用於傳回類別。

>>> pvals = [[.1, .5, .4 ], [.3, .7, .0]]
>>> rvs = rng.multinomial(1, pvals, size=(4,2))
>>> rvs.argmax(axis=-1)
array([[0, 1],
       [2, 0],
       [2, 1],
       [2, 0]], dtype=int64)  # random

可以使用廣播產生相同的輸出維度。

>>> rvs = rng.multinomial([[1]] * 4, pvals)
>>> rvs.argmax(axis=-1)
array([[0, 1],
       [2, 0],
       [2, 1],
       [2, 0]], dtype=int64)  # random

機率輸入應正規化。作為實作細節,最後一個條目的值會被忽略,並假設佔用任何剩餘的機率質量,但不應依賴此行為。權重在一側是另一側兩倍的有偏差硬幣應像這樣取樣

>>> rng.multinomial(100, [1.0 / 3, 2.0 / 3])  # RIGHT
array([38, 62])  # random

而不是像這樣

>>> rng.multinomial(100, [1.0, 2.0])  # WRONG
Traceback (most recent call last):
ValueError: pvals < 0, pvals > 1 or pvals contains NaNs