Spec-Zone.ru › NumPy 2.0

numpy.random.Generator.multinomial

метод

random.Generator.multinomial(n, pvals, size=None)

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

Многомерное распределение — это многомерное обобщение биномиального распределения. Рассмотрим эксперимент с одним из p возможных исходов. Примером такого эксперимента является подбрасывание игральной кости, где результат может быть от 1 до 6. Каждая выборка, полученная из распределения, представляет n такие эксперименты. Его значения, X_i = [X_0, X_1, ..., X_p], представляют количество раз, когда результат был i.

Параметры:
nint или массив-подобный объект int

Количество экспериментов.

pvalsмассив-подобный объект float

Вероятности каждого из p различных исходов с формой (k0, k1, ..., kn, p). Каждый элемент pvals[i,j,...,:] должен суммироваться до 1 (однако последний элемент всегда предполагается учитывать оставшуюся вероятность, до тех пор, пока sum(pvals[..., :-1], axis=-1) <= 1.0. Должен иметь по крайней мере 1 измерение, где pvals.shape[-1] > 0.

sizeint или кортеж из int, необязательно

Форма выходных данных. Если заданная форма, например, (m, n, k), тогда m * n * k выборок генерируются, каждая из p элементов. По умолчанию None, где размер выходных данных определяется по форме векторизации n и по всем по последнему измерению pvals, что обозначается как b=(b0, b1, ..., bq). Если size не None, то он должен быть совместим с формой векторизации b. В частности, размер должен иметь q или более элементов, и size[-(q-j):] должен равняться bj.

Возвращает:
outndarray

Сгенерированные выборки, с формой size, если задано. Когда size задан, форма выходных данных size + (p,) Если не указано, форма определяется формой векторизации n и pvals, (b0, b1, ..., bq) дополненной измерением многомерного распределения, p, так что форма выходных данных (b0, b1, ..., bq, p).

Каждый элемент out[i,j,...,:] является p-мерным значением, полученным из распределения.

Изменено в версии 1.22.0: Добавлена поддержка векторизации pvals относительно n

Примеры

Подбрасывание игральной кости 20 раз:

>>> rng = np.random.default_rng()
>>> rng.multinomial(20, [1/6.]*6, size=1)
array([[4, 1, 7, 5, 2, 1]])  # random

Выпало 4 раза 1, 1 раз 2 и т.д.

Теперь подбросьте кость 20 раз, и еще 20 раз:

>>> rng.multinomial(20, [1/6.]*6, size=2)
array([[3, 4, 3, 3, 4, 3],
       [2, 4, 3, 4, 0, 7]])  # random

В первом случае 3 раза выпало 1, 4 раза 2 и т.д. Во втором случае 2 раза выпало 1, 4 раза 2 и т.д.

Теперь выполните один эксперимент, подбросив кость 10 раз, и еще 10 раз, и еще один эксперимент подбросив кость 20 раз, и еще 20 раз:

>>> rng.multinomial([[10], [20]], [1/6.]*6, size=(2, 2))
array([[[2, 4, 0, 1, 2, 1],
        [1, 3, 0, 3, 1, 2]],
       [[1, 4, 4, 4, 4, 3],
        [3, 3, 2, 5, 5, 2]]])  # random

Первый массив показывает результаты подбрасывания кости 10 раз, а второй — результаты подбрасывания кости 20 раз.

Нагруженная кость чаще выпадает на 6:

>>> rng.multinomial(100, [1/7.]*5 + [2/7.])
array([11, 16, 14, 17, 16, 26])  # random

Моделирование 10 подбрасываний 4-сторонней кости и 20 подбрасываний 6-сторонней кости

>>> rng.multinomial([10, 20],[[1/4]*4 + [0]*2, [1/6]*6])
array([[2, 1, 4, 3, 0, 0],
       [3, 3, 3, 6, 1, 4]], dtype=int64)  # random

Генерация категориальных случайных величин из двух категорий, где первая имеет 3 исхода, а вторая — 2.

>>> rng.multinomial(1, [[.1, .5, .4 ], [.3, .7, .0]])
array([[0, 0, 1],
       [0, 1, 0]], dtype=int64)  # random

argmax(axis=-1) затем используется для возврата категорий.

>>> pvals = [[.1, .5, .4 ], [.3, .7, .0]]
>>> rvs = rng.multinomial(1, pvals, size=(4,2))
>>> rvs.argmax(axis=-1)
array([[0, 1],
       [2, 0],
       [2, 1],
       [2, 0]], dtype=int64)  # random

Такой же размер выходных данных можно получить с помощью векторизации.

>>> rvs = rng.multinomial([[1]] * 4, pvals)
>>> rvs.argmax(axis=-1)
array([[0, 1],
       [2, 0],
       [2, 1],
       [2, 0]], dtype=int64)  # random

Входные данные о вероятности должны быть нормализованы. В качестве реализации, значение последнего элемента игнорируется и предполагается, что он занимает оставшуюся вероятность, но на этом не стоит полагаться. Сбошенный монета, у которой одна сторона в два раза тяжелее другой, должна быть смоделирована так:

>>> rng.multinomial(100, [1.0 / 3, 2.0 / 3])  # RIGHT
array([38, 62])  # random

а не так:

>>> rng.multinomial(100, [1.0, 2.0])  # WRONG
Traceback (most recent call last):
ValueError: pvals < 0, pvals > 1 or pvals contains NaNs

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

Spec-Zone.ru

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