NumPy是一个开源的Python科学计算库,我们在之前的文章中已经对其做了基本的介绍,而且也对numpy的数据结构、基础函数等做了入门的讲解。
numpy random是其很重要的一个模块,在此模块中有很多有实际应用价值的函数,每个函数都会对应一个或者多个数学场景。本篇旨在介绍其中的一个关于多项式分布取样本的函数– multinomial
1、multinomial介绍
numpy.random.multinomial
(n, pvals, size=None)
- n : int:实验次数
- pvals:浮点数序列,长度p。P个不同结果的概率。这些值应该和为1(但是,只要求和(pvals[:-1])<=1,最后一个元素总是被假定为考虑剩余的概率)。
- size : int 或 int的元组,可选。 输出形状。如果给定形状为(m,n,k),则绘制 mnk 样本。默认值为无,在这种情况下返回单个值。
返回值: ndarray,每个条目 [i,j,…,:] 都是从分布中提取的一个n维值。
多项式分布,从多项式分布中提取样本。
多项式分布是二项式分布的多元推广。做一个有P个可能结果的实验。这种实验的一个例子是掷骰子,结果可以是1到6。从分布图中提取的每个样本代表n个这样的实验。其值x_i = [x_0,x_1,…,x_p] 表示结果为i的次数。
2、实例介绍
官方文档中已经给出了非常简洁易懂的实例,我们直接拿过来摆一下。这个实例就是掷骰子。
场景描述:我们知道骰子一共是6面,每个面代表一个数字,分别是1、2、3、4、5、6.我们每次抛骰子得到的数字公概率上来讲都是等概率的1/6;那么我们做一组实验,抛20次骰子得到的样本会是什么样的呢?通过 numpy.random.multinomial
函数将此场景再现出来就是以下代码:
>>> np.random.multinomial(20, [1/6.]*6, size=1) array([[4, 1, 7, 5, 2, 1]])
以上的代码和结果输出表示的是:我们得到数字是1的次数是4次,得到2的次数是1词,得到3的次数是7次,以此类推。
返回值的数字表示样本值的次数,而对应数字的数组索引位置表示的是实际的值。
如果我们循环来对同一场景做多次样本实验呢?
for i in range(4): a =np.random.multinomial(20, [1/6.]*6, size=1) print(a) #[[2 6 3 5 3 1]] #[[4 4 1 3 4 4]] #[[0 4 3 5 2 6]] #[[4 3 2 5 3 3]]
我们可以看出每次的实验结果都是不一样的。这也体现了实际情况下有限实现取样的随机性。
多次取样在官方实验的代码demo是通过参数来控制的。
>>> np.random.multinomial(20, [1/6.]*6, size=2) array([[3, 4, 3, 3, 4, 3], [2, 4, 3, 4, 0, 7]])
size在这个地方跟我们通过循环多次实验是一样的效果。