numpy.random.Generator.multinomial#

метод

random.Generator.мультиномиальное(n, pvals, размер=None)#

Извлеките выборки из мультиномиального распределения.

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

Параметры:
nint или array-like из int

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

pvalsarray-like из чисел с плавающей точкой

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

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

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

Возвращает:
выходndarray

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

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

Примеры

Бросьте кубик 20 раз:

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

Он приземлился 4 раза на 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