numpy.random.Generator.multinomial#
method
- random.Generator.multinomial(n, pvals, size=None)#
从多项分布中抽取样本.
多项分布是二项分布的多元推广.进行一个具有
p个可能结果的实验.这种实验的一个例子是掷骰子,结果可以是 1 到 6.从分布中抽取的每个样本代表 n 个这样的实验.它的值,X_i = [X_0, X_1, ..., X_p],表示结果是i的次数.- 参数:
- nint 或类数组的 int
实验次数.
- pvals浮点数数组类.
p个不同结果中每个结果的概率,形状为(k0, k1, ..., kn, p).每个元素pvals[i,j,...,:]必须总和为 1(但是,总是假定最后一个元素考虑剩余的概率,只要sum(pvals[..., :-1], axis=-1) <= 1.0即可.必须至少具有 1 个维度,其中 pvals.shape[-1] > 0.- sizeint 或 int 元组,可选
输出形状.如果给定的形状是例如
(m, n, k),那么将抽取每个具有p个元素的m * n * k个样本.默认值为 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
对于第一次运行,我们掷出 3 次 1,4 次 2,等等.对于第二次,我们掷出 2 次 1,4 次 2,等等.
现在,做一个实验,掷骰子 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