numpy.random.Generator.multivariate_hypergeometric#

метод

random.Generator.multivariate_hypergeometric(цвета, nsample, размер=None, метод='marginals')#

Генерация вариантов из многомерного гипергеометрического распределения.

Многомерное гипергеометрическое распределение является обобщением гипергеометрического распределения.

Выбрать nsample элементы случайным образом без замены из коллекции с N различных типов. N является длиной colorsкороче, чем colors являются количеством вхождений этого типа в коллекции. Общее количество элементов в коллекции sum(colors). Каждая случайная величина, сгенерированная этой функцией, представляет собой вектор длины N содержащий количество различных типов, которые встречались в nsample элементы.

Имя colors происходит из общего описания распределения: это распределение вероятностей количества шариков каждого цвета, выбранных без возвращения из урны, содержащей шарики разных цветов; colors[i] это количество шариков в урне цвета i.

Параметры:
цветапоследовательность целых чисел

Количество каждого типа элемента в коллекции, из которой берется выборка. Значения в colors должно быть неотрицательным. Чтобы избежать потери точности в алгоритме, sum(colors) должно быть меньше 10**9 когда метод является "маргинальными".

nsampleint

Количество выбранных элементов. nsample не должно быть больше чем sum(colors).

размерint или кортеж ints, опционально

Количество вариантов для генерации, либо целое число, либо кортеж, содержащий форму массива вариантов. Если заданный размер —, например, (k, m), затем k * m варианты извлекаются, где один вариант является вектором длины len(colors), и возвращаемое значение имеет форму (k, m, len(colors)). Если size является целым числом, выходные данные имеют форму (size, len(colors)). По умолчанию – None, в этом случае возвращается одна переменная как массив формы (len(colors),).

методstring, 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).

Алгоритм "маргиналов" генерирует вариант с помощью повторных вызовов одномерного гипергеометрического сэмплера. Он примерно эквивалентен:

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". В некоторых случаях (например, когда цвета содержит относительно небольшие целые числа), метод "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]]])