1、语法
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
(n, pvals, size=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次,等等。
- 掷骰子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 官方举例:
第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行解释同上。
引用
- https://www.baidu.com/link?url=oVInJEzUk5hre4I9e3Iis5nWkfxldysfhit9DrGxBaquKbLagD_B2-07GG0-bkUQ&wd=&eqid=f196b481000131550000000262d907be
- https://www.baidu.com/link?url=aandVKO6qSDyG5ve7aPQ5YK4xXQKlY5S9gbA17oQh9h_CBDYl85QNNt0DwJFNs8tnFhmYcMpkpuLOS_d0AcHmq&wd=&eqid=f196b481000131550000000262d907be
- https://discuss.pytorch.org/t/trying-to-understand-the-torch-multinomial/71643
- https://blog.csdn.net/qq_15192373/article/details/90265450