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,)`。如果未指定,则形状由
n
和pvals
的广播形状(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
概率输入应进行归一化。作为实现细节,最后一个条目的值被忽略,并假定它占据所有剩余的概率质量,但这一点不应被依赖。一个偏向性硬币,其一面比另一面重一倍,应如下采样:
>>> 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