Монте-Карло генератор (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