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