1、语法

multinomial(input, num_samples, replacement=False, *, generator=None, out=None) -> LongTensor

1.1 位置参数:

  • input:包含概率数据的输入张量。​input​​​ 的行不需要总和为 1(在这种情况下,我们将值用作权重),但必须是非负的、有限的并且总和非零。索引根据每个采样的时间从左到右排序(第一个样本放在第一列)。如果 ​​input​​​ 是向量,则 ​​out​​​ 是大小为 ​​num_samples​​​ 的向量。如果 ​​input​​​ 是具有 ​​m​​​ 行的矩阵,则 ​​out是​(m×num_samples)的矩阵。
  • num_samples:要抽取的样本数,也就是:每行的取值次数,该值不能大于每一行的元素数,否则会报错
  • replacement:布尔值表示取样时有无放回,True是有放回,False无放回。

1.2 关键字参数:

  • generator(​​torch.Generator​​, 可选的) -用于采样的伪随机数发生器
  • out(Tensor,可选的) -输出张量。返回一个张量,其中每行包含从位于张量 ​​input​​​ 的相应行中的多项概率分布中采样的 ​​num_samples​​ 索引。

1.3 函数功能

整体作用:实现从多项式分布中提取样本。

多项式分布是二项式分布的多元推广。在此简单介绍一下多项式分布。

做一个有P个可能结果的实验。这种实验的一个例子是掷骰子,结果可以是1到6。从分布图中提取的每个样本代表n个这样的实验。其值x_i = [x_0,x_1,…,x_p] 表示结果为i的次数。

对input中的每一行做n_samples次取值,每一次取值时的输出张量是input当前行对应元素的下标。

[取样原则]典型情况下,input可以看成一个权重张量,每一个元素的值代表其在该行中的权重。如果有元素为0,那么在其他不为0的元素被取完之前,该元素不会被取到。

2、应用举例

2.1 numpy.random.multinomial用法

在numpy库有也有一个多项式分布函数。此函数的作用与PyTorch中的基本一致,但是前者用法更为简单(单一)。此函数语法格式如下:

​numpy.random.​​​​multinomial​​(npvalssize=None)

各参数含义:

  • n :  int:实验次数
  • pvals:浮点数序列,长度p。P个不同结果的概率。这些值应该和为1(但是,只要求和(pvals[:-1])<=1,最后一个元素总是被假定为考虑剩余的概率)。
  • size :  int 或 int的元组,可选。 输出形状。如果给定形状为(m,n,k),则绘制 m*n*k 样本。默认值为无,在这种情况下返回单个值。

返回值

  • ndarray,每个条目 [i,j,…,:] 都是从分布中提取的一个n维值。

举例:

1. 掷骰子20次:

>>> np.random.multinomial(20, [1/6.]*6, size=1)

结果:array([[6, 2, 3, 2, 3, 4]])

表示:骰子上的字1朝下6次,字2朝下2次,字3朝下3次,字4朝下2次,等等。

  1. 掷骰子20次,再掷20次(可以看作独立的两组):

>>> np.random.multinomial(20, [1/6.]*6, size=2)

结果:array([[3, 4, 3, 3, 4, 3],

      [2, 4, 3, 4, 0, 7]])

说明:第一组中,我们掷了3次1,4次2,等等。第二组中,我们掷了2次1,4次2,等等。

总体来看,numpy.random.multinomial函数参数易于理解,用法直观。

 3.再来看一个稍微更复杂一些的例子:

np.random.multinomial(20, [2/6.]+[3/6.]+[1/6.], size=4)

输出结果:array([[ 9, 10,  1],

       [ 8,  8,  4],

       [10,  5,  5],

       [ 8,  6,  6]])

上面参数中,20是指实验做20次,size=4的含义可以理解为作了3组,其中每一组做20次。

另外,由Python常识知:[2/6.]+[3/6.]+[1/6.]等价于[2/6., 3/6., 1/6.]

那么,这个数组中三个值的含义为三种概率取值(和为1),不妨假设为某随机事件结果仅有三种情形(甲、乙、丙),则理解为在一次随机实验中甲、乙、丙三种情形发生的概率分别为:2/6., 3/6., 1/6.

于是,上面结果的含义是:在第1组实验中(20次),出现甲情形9次,乙情形出现10次,丙情形出现1次;在第2组实验中(20次),出现甲情形8次,乙情形出现8次,丙情形出现4次......

2.2 torch.multinomial

对于这个函数,要仔细领悟好其中各个参数含义。

2.2.1 官方举例:

weights = torch.Tensor([0, 10, 3, 0])
torch.multinomial(weights, 4, replacement=True)

第1次运行代码行2,结果是:tensor([1, 1, 1, 1])

第2次运行代码行2,结果是:tensor([1, 2, 1, 1])

第3次运行代码行2,结果是:tensor([2, 1, 1, 1])

第4次运行代码行2,结果是:tensor([1, 2, 1, 2])

解释:

第1个参数由名称已经说明白了,这个张量数组中各元素不是概率值,而代表四种情形(例如甲、乙、丙、丁四种情形)各自的权值(理解为概率的话,可以认为四种情形发生的概率依次为0/13,10/13,3/13,0/13。

第2个参数4:代表抽样为4次(样本抽取次数)

第3个参数:说明是有放回抽样。

上面第1次运行结果含义是:第1次抽到下标为1的元素(即10),第2次抽到下标为1的元素(即10),第3次抽到下标为1的元素(即10),第4次抽到下标为1的元素(即10)。

第2次运行结果含义是:第1次抽到下标为1的元素(即10),第2次抽到下标为2的元素(即3),第3次抽到下标为1的元素(即10),第4次抽到下标为1的元素(即10)。

第3次运行结果含义是:第1次抽到下标为2的元素(即3),第2次抽到下标为1的元素(即10),第3次抽到下标为1的元素(即10),第4次抽到下标为1的元素(即10)。

第4次运行结果含义是:第1次抽到下标为1的元素(即10),第2次抽到下标为2的元素(即3),第3次抽到下标为1的元素(即10),第4次抽到下标为2的元素(即3)。

2.2.2 自己的举例:

>>> data=torch.rand(2,6)

>>> torch.multinomial(data,3)

tensor([[2, 1, 3],

        [3, 0, 4]])

>>> data

tensor([[0.3216, 0.4025, 0.9495, 0.9842, 0.1973, 0.2931],

        [0.6323, 0.0737, 0.0592, 0.2050, 0.6082, 0.4252]])

结果理解:

data含义:进行2组实验,各组实验同样对应6种状态(每一行中的6个值,对应各种状态相应的权值,而不是概率!)

抽样为3次(样本抽取次数),默认为无放回抽样。

自然,函数返回结果也是两组,以第1组为例([2, 1, 3])。说明在第一组实验中,第1次抽取的是下标为2的数据(即0.9495),第2次抽取的是下标为1的数据(即0.4025),第3次抽取的是下标为3的数据(即0.9842)。

对于张量中的第2行解释同上。

引用