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)
.如果大小不是 None,那么它必须与广播形状b
兼容.具体来说,大小必须有q
或更多元素,并且 size[-(q-j):] 必须等于bj
.
- 返回:
- outndarray
如果提供了大小,则抽取的样本,形状为大小.当提供了大小,输出形状为大小 + (p,).如果未指定,形状由
n
和pvals
的广播形状(b0, b1, ..., bq)
加上多项式的维度p
决定,因此输出形状为(b0, b1, ..., bq, p)
.每个条目
out[i,j,...,:]
是从分布中抽取的p
维值.在 1.22.0 版本发生变更: 增加了对 pvals 与 n 之间的广播支持
示例
掷骰子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
模拟一个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