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