numpy.random.Generator.multivariate_hypergeometric#

方法

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)``必须小于``10**9``.

nsampleint

选中的项目数量.``nsample`` 必须不大于 sum(colors).

size整数或整数的元组,可选

要生成的变量数量,可以是整数或包含变量数组形状的元组.如果给定的尺寸是,例如 (k, m),则绘制 k * m 个变量,其中每个变量是一个长度为 len(colors) 的向量,返回值的形状为 (k, m, len(colors)).如果 size 是整数,则输出形状为 (size, len(colors)).默认值为 None,在这种情况下,返回一个形状为 (len(colors),) 的单个变量数组.

method字符串,可选

指定用于生成变量的算法.必须是 ‘count’ 或 ‘marginals’(默认).请参阅备注以了解方法的描述.

返回:
variatesndarray

从多元超几何分布中抽取的变量数组.

参见

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) 的临时整数数组.

“边缘”算法通过使用对单变量超几何采样器的重复调用来生成变量.它大致相当于:

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” 方法快得多.如果算法的性能很重要,请用典型输入测试这两种方法,以决定哪种效果最好.

在 1.18.0 版本加入.

示例

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