Spec-Zone.ru › NumPy 2.0

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 равном “marginals”.

nsampleцелое число

Количество выбранных элементов. 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).

Алгоритм “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]]])

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/random/generated/numpy.random.Generator.multivariate_hypergeometric.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API