numpy.random.Generator.multivariate_hypergeometric

方法

random.Generator.multivariate_hypergeometric(colors, nsample, size=None, method='marginals')

从多元超几何分布生成变量。

多元超几何分布是超几何分布的推广。

选择 nsample 从一个带有 N 不同的类型。 N 长度是 colors 和中的值 colors 集合中该类型的出现次数。集合中的项目总数为 sum(colors) . 这个函数产生的每个随机变量都是一个长度向量 N 保存中发生的不同类型的计数 nsample 项目。

名字 colors 来源于对分布的一种常见描述:它是从一个装有不同颜色大理石的骨灰盒中选择的每种颜色的大理石数量的概率分布,而不需要更换; colors[i] 是瓮中大理石的数量和颜色 i .

参数
colors整数序列

从中提取样本的集合中每种类型项的编号。中的值 colors 必须为非负。为了避免算法的精度损失, sum(colors) 必须小于 10**9 什么时候? method 是“边缘”。

nsample利息

选定的项目数。 nsample 不得大于 sum(colors) .

sizeint或int的元组,可选

要生成的变量数,可以是整数,也可以是保持变量数组形状的元组。如果给定的大小是,例如。, (k, m) 然后 k * m 绘制变量,其中一个变量是长度向量 len(colors) ,并且返回值具有形状 (k, m, len(colors)) . 如果 size 是一个整数,输出有形状 (size, len(colors)) . 默认值是None,在这种情况下,一个变量作为一个带形状的数组返回 (len(colors),) .

method字符串,可选

指定用于生成变量的算法。必须是“count”或“marginals”(默认值)。有关方法的说明,请参见注释。

返回
variates恩达雷

从多元超几何分布中提取的变量数组。

参见

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

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