numpy.random.Generator.multinomial#

方法

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

从多项分布中抽取样本。

多项分布是二项分布的多元推广。进行一个有 p 种可能结果的实验。此类实验的一个例子是掷骰子,结果可以是 1 到 6。从分布中抽取的每个样本代表 n 次此类实验。其值 X_i = [X_0, X_1, ..., X_p] 代表结果为 i 的次数。

参数:
nint 或 array-like 的 int

实验次数。

pvalsarray-like 的 float

p 个不同结果的概率,形状为 (k0, k1, ..., kn, p)。每个元素 pvals[i,j,...,:] 的总和必须为 1(然而,只要 sum(pvals[..., :-1], axis=-1) <= 1.0,最后一个元素总是被假定为占剩余的概率)。必须至少有一个维度使得 pvals.shape[-1] > 0。

sizeint 或 int 的元组,可选

输出形状。如果给定的形状是,例如,(m, n, k),那么将从 p 个元素中分别抽取 m * n * k 个样本。默认为 None,此时输出大小由 npvals 的最后一个维度(记为 b=(b0, b1, ..., bq))的广播形状决定。如果 size 不是 None,则它必须与广播形状 b 兼容。具体来说,size 必须有 q 个或更多元素,并且 size[-(q-j):] 必须等于 bj

返回:
outndarray

如果提供了 size,则绘制的样本形状为 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

模拟掷一个 4 面骰子 10 次,以及掷一个 6 面骰子 20 次

>>> 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

概率输入应进行归一化。作为实现细节,最后一个条目的值将被忽略,并假定它承担任何剩余的概率质量,但不应依赖此行为。一个两面权重比为 2:1 的不公平硬币应这样采样

>>> 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