maxframe.tensor.random.multinomial#

maxframe.tensor.random.multinomial(n, pvals, size=None, chunk_size=None, gpu=None, dtype=None)[源代码]#

从多项分布中抽取样本。

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

参数:
  • n (int) -- 实验次数。

  • pvals (sequence of floats, length p) -- 每种 p 个不同结果的概率。它们的总和应为 1(不过只要 sum(pvals[:-1]) <= 1,最后一个元素总是被假定为占剩余概率)。

  • size (int or tuple of ints, optional) -- 输出形状。如果给定的形状是,例如 (m, n, k),则抽取 m * n * k 个样本。默认为 None,此时返回单个值。

  • chunk_size (int or tuple of int or tuple of ints, optional) -- 每个维度上的期望分块大小

  • gpu (bool, optional) -- 如果为 True,则在 GPU 上分配张量,默认为 False

  • dtype (data-type, optional) -- 返回张量的数据类型。

返回:

out -- 抽取的样本,形状为 *size*(如果提供了该参数)。否则,形状为 (N,)。换句话说,每个条目 out[i,j,...,:] 是从分布中抽取的一个 N 维值。

返回类型:

Tensor

示例

掷骰子 20 次:

>>> import maxframe.tensor as mt
>>> mt.random.multinomial(20, [1/6.]*6, size=1).execute()
array([[4, 1, 7, 5, 2, 1]])

结果中 1 出现了 4 次,2 出现了 1 次,等等。

现在,掷骰子 20 次,再掷 20 次:

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

第一次掷骰,1 出现了 3 次,2 出现了 4 次,等等。第二次掷骰,1 出现了 2 次,2 出现了 4 次,等等。

一个灌铅的骰子更可能落在数字 6 上:

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

概率输入应进行归一化。作为实现细节,最后一个值将被忽略,并被假定占据任何剩余的概率质量,但不应依赖于此。一枚偏向一边的硬币(某一侧的权重是另一侧的两倍)应这样采样:

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

而不是这样:

>>> mt.random.multinomial(100, [1.0, 2.0]).execute()  # WRONG
array([100,   0])