numpy.random.Generator.multivariate_hypergeometric#
method
- random.Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals')#
从多元超几何分布中生成变量.
多元超几何分布是超几何分布的推广.
从具有
N种不同类型的集合中无放回地随机选择nsample个项目.N是colors的长度,colors中的值是该类型在集合中出现的次数.集合中项目的总数为sum(colors).此函数生成的每个随机变量都是一个长度为N的向量,其中包含nsample个项目中发生的各种类型的计数.名称
colors来自对分布的常见描述:它是从一个装有不同颜色弹珠的瓮中,无放回地选择每种颜色的弹珠的数量的概率分布;colors[i]是瓮中颜色为i的弹珠的数量.- 参数:
- colors整数序列
从中抽取样本的集合中每种类型的物品的数量.
colors中的值必须是非负数.为了避免算法中精度损失,当 method 为 “marginals” 时,sum(colors)必须小于109.- nsampleint
选择的项目数.
nsample不能大于sum(colors).- sizeint 或 int 的元组,可选.
要生成的变量的数量,可以是整数或包含变量数组形状的元组.如果给定的 size 是,例如
(k, m),那么将抽取k * m个变量,其中一个变量是长度为len(colors)的向量,返回值具有形状(k, m, len(colors)).如果 size 是一个整数,则输出的形状为(size, len(colors)).默认为 None,在这种情况下,单个变量将作为形状为(len(colors),)的数组返回.- methodstring, optional
指定用于生成变量的算法.必须是 ‘count’ 或 ‘marginals’ (默认值).参见“注释”部分了解有关这些方法的描述.
- 返回:
- 变量ndarray
从多元超几何分布中抽取的变量数组.
参见
hypergeometric从(单变量)超几何分布中抽取样本.
注释
这两种方法不会返回相同的变量序列.
“count”算法大致等同于以下 numpy 代码:
choices = np.repeat(np.arange(len(colors)), colors) selection = np.random.choice(choices, nsample, replace=False) variate = np.bincount(selection, minlength=len(colors))
“count”算法使用一个长度为
sum(colors)的临时整数数组.“marginals”算法通过重复调用单变量超几何采样器来生成一个变量.它大致等同于:
variate = np.zeros(len(colors), dtype=np.int64) # `remaining` is the cumulative sum of `colors` from the last # element to the first; e.g. if `colors` is [3, 1, 5], then # `remaining` is [9, 6, 5]. remaining = np.cumsum(colors[::-1])[::-1] for i in range(len(colors)-1): if nsample < 1: break variate[i] = hypergeometric(colors[i], remaining[i+1], nsample) nsample -= variate[i] variate[-1] = nsample
默认方法是“marginals”.对于某些情况(例如,当 colors 包含相对较小的整数时),“count”方法可能比“marginals”方法快得多.如果算法的性能很重要,请使用典型输入测试这两种方法,以确定哪种方法效果最佳.
示例
>>> colors = [16, 8, 4] >>> seed = 4861946401452 >>> gen = np.random.Generator(np.random.PCG64(seed)) >>> gen.multivariate_hypergeometric(colors, 6) array([5, 0, 1]) >>> gen.multivariate_hypergeometric(colors, 6, size=3) array([[5, 0, 1], [2, 2, 2], [3, 3, 0]]) >>> gen.multivariate_hypergeometric(colors, 6, size=(2, 2)) array([[[3, 2, 1], [3, 2, 1]], [[4, 1, 1], [3, 2, 1]]])