C++ и Python

Монте-Карло генератор (5)

Монте-Карло генератор

В этом задании Вам предстоит создать инструмент генерирования выборок для непрерывной случайной величины с заданной плотностью вероятности. Для решения задачи будем использовать метод Неймана. Идея метода состоит в следующем: пусть случайная величина X определена на прямоугольной области Omega размерности n: [x1_min, x1_max] x ... x [xn_min, xn_max]. Случайной величине X соответствует плотность распределения веростности p. Обозначим за M глобальный максимум плотности p. Следующая процедура позволяет получать выборку значений случайной величины X:

  • Выбираем равномерно случайную точку X_i в области Omega
  • Выбираем равномерно случайное значение xi в диапазоне от 0 до M
  • Сравниваем xi со значением плотности вероятности p_i в точке X_i:
    • Если xi <= p_i, то сохраняем точку X_i
    • Если xi > p_i, то отбрасываем точку X_i

Повторяя описанную процедуру достаточное количество раз, можно получить выборку значений случайной величины X нужного размера.

Реализуйте функцию

def generate(pdf, limits, majorant, chunk_size, num_chunks)

Функция generate принимает следующие аргументы:

  • pdf - callable объект - плотность распределения случайной величины
  • limits - определение прямоугольной области Omega в виде кортежа пар ([x1_min, x1_max], [x2_min, x2_max], ..., [xn_min, xn_max])
  • majorant - максимальное значение для величины xi

Последние два аргумента - целые числа chunk_size и num_chunks - определяют размер выборки. Массивы numpy позволяют выполнять процедуру генерирования случайных событий векторизованно: за раз генерировать массив формы (chunk_size, n), каждая строчка которой является точкой в области Omega кандидатом в итоговую выборку. Величина xi в этом случае является массивом формы (chunk_size, ). Такой способ позволяет генерировать события гораздо быстрее, чем по одному.

Если требуется большая выборка, то chunk_size может оказаться слишком большим для хранения массива формы (chunk_size, n) в памяти. В этом случае имеет смысл задать допустимое значение chunk_size, но выполнить процедуру несколько раз, а отобранные события объединить. Параметр num_chunks определяет количество таких повторений.

Размер полученной выборки, таким образом, является случайной величиной, зависящий от эффективности процедуры и параметров chunk_size и num_chunks.

Указания

  • Считайте, что pdf принимает n аргументов типа np.ndarray.

Как тестировать локально

Установить необходимые пакеты (один раз):

pip install -r requirements.txt

Запустить тесты:

pytest -vs