Монте-Карло генератор
В этом задании Вам предстоит создать инструмент генерирования выборок для непрерывной случайной величины с заданной плотностью вероятности. Для решения задачи будем использовать метод Неймана. Идея метода состоит в следующем: пусть случайная величина 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