Как Numpy выбирает случайные числа из неравномерного распределения? - PullRequest
0 голосов
/ 03 апреля 2019

Я узнал о методах случайной выборки и знаю, что Numpy использует Mersenne-Twister для генерации однородных случайных чисел, как он затем передает их для генерации неравномерных распределений?

Например:

np.random.normal(mu,sigma,n)

Какой алгоритм используется здесь для выборки нормально распределенных чисел? Спасибо.

1 Ответ

2 голосов
/ 03 апреля 2019

Ваш общий вопрос слишком широкий, он может (и может) заполнить весь учебник .

Тем не менее, очень быстрый обзор заключается в том, что методы для генерации неединообразные случайные числа попадают в несколько общих категорий.К ним относятся:

  1. Обратное преобразование кумулятивной функции распределения (CDF);
  2. Свертка (суммы случайных величин сами по себе являются случайными переменными с другим распределением);
  3. Композиция (разложение сложного распределения на более простые части с использованием условной вероятности);
  4. Методы принятия / отклонения (генерировать случайные «догадки», отклонять и повторять, если нарушены ограничения целевого распределения);и
  5. «Особые отношения» (признавая, что некоторые распределения имеют тесную связь с другими, которые легче генерировать).

Простой пример каждого из 1-3 и 5можно найти в разделе 4.3 этого учебного документа .

На практике часто используется комбинация методов.

Например, нормальное распределение не может быть найдено аналитически путем инверсии, потому что для этого потребуется возможность написать уравнение в замкнутой форме для CDF.

Два популярных варианта генерации нормалей смотрят на пары нормалей в полярных координатах, т. Е. Выражают как направление и расстояние.Базовый алгоритм Бокса-Мюллера отмечает, что направление равномерно от 0 до 2π, и Пифагор говорит нам, что расстояние основано на сумме квадратов нормалей, которая имеет распределение хи-квадрат (2) (свертка).«Специальные отношения» говорят нам, что хи-квадрат (2) - это экспонента (2), которую легко получить с помощью инверсии.Сведение всех частей вместе и преобразование обратно в декартовы координаты дает пару формул, найденных в статье в Википедии.

Второй вариант - Полярный метод Марсальи , который выглядит как метод, используемый NumPy .Это позволяет избежать оценки трансцендентных функций синуса / косинуса, генерируя точки случайным образом в квадрате и отбрасывая любые, которые не содержатся внутри ограниченного круга (принятие / отклонение).Затем он масштабирует результаты с использованием того же вычисления хи-квадрат / экспоненциального расстояния, поэтому он также использует свертку, «особые отношения» и инверсию.

Самые быстрые подходы основаны на алгоритме ziggurat , который разбивает нормаль на слои (состав), использует специальные отношения для некоторых слоев и использует принятие / отклонение для обработки хвостов слоя.

...