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