Преобразование Бокса – Мюллера

Преобразование Бокса -Мюллера , Джордж Эдвард Пелэм Бокс и Мервин Эдгар Мюллер , [ 1 ] — это метод выборки случайных чисел для генерации пар независимых , стандартных, нормально распределенных (нулевое ожидание , единичная дисперсия ) случайных чисел с учетом источника равномерно распределенных случайных чисел. Этот метод был впервые упомянут Раймондом Э.А.К. Пейли и Норбертом Винером в их трактате 1934 года о преобразованиях Фурье в комплексной области. [ 2 ] Учитывая статус этих последних авторов, а также широкую доступность и использование их трактата, почти наверняка Бокс и Мюллер были хорошо осведомлены о его содержании.
Преобразование Бокса – Мюллера обычно выражается в двух формах. Базовая форма, заданная Боксом и Мюллером, берет две выборки из равномерного распределения на интервале (0,1) и сопоставляет их с двумя стандартными, нормально распределенными выборками. Полярная форма берет две выборки из разных интервалов, [−1,+1] и сопоставляет их с двумя нормально распределенными выборками без использования функций синуса или косинуса.
Преобразование Бокса-Мюллера было разработано как более эффективная в вычислительном отношении альтернатива методу выборки обратного преобразования . [ 3 ] Алгоритм зиккурата дает более эффективный метод для скалярных процессоров (например, старых процессоров), тогда как преобразование Бокса-Мюллера лучше подходит для процессоров с векторными модулями (например, графических процессоров или современных процессоров). [ 4 ]
Основная форма
[ редактировать ]Предположим, что U 1 и U 2 являются независимыми выборками, выбранными из равномерного распределения на единичном интервале (0, 1) . Позволять и
Тогда Z0 Z1 и — распределением независимые стандартным случайные величины со нормальным .
Вывод [ 5 ] основан на свойстве двумерной декартовой системы , где координаты X и Y описываются двумя независимыми и нормально распределенными случайными величинами, случайными величинами для R 2 и Θ (показано выше) в соответствующих полярных координатах также независимы и могут быть выражены как и
Потому что Р 2 является квадратом нормы стандартной двумерной нормальной переменной ( X , Y ) , она имеет распределение хи-квадрат с двумя степенями свободы. В частном случае двух степеней свободы распределение хи-квадрат совпадает с экспоненциальным распределением и уравнение для R 2 выше представлен простой способ генерации необходимой экспоненциальной переменной.
Полярная форма
[ редактировать ]
Полярную форму впервые предложил Дж. Белл. [ 6 ] и затем модифицирован Р. Кнопом. [ 7 ] Хотя было описано несколько различных версий полярного метода, здесь будет описана версия Р. Кнопа, поскольку она наиболее широко используется, отчасти из-за ее включения в числовые рецепты . Немного другая форма описана Д. Кнутом как «Алгоритм P» в книге «Искусство компьютерного программирования » . [ 8 ]
Учитывая u и v , независимые и равномерно распределенные в замкнутом интервале [−1, +1] , положим s = R 2 = ты 2 + v 2 . Если s = 0 или s ≥ 1 , отбросьте u и v и попробуйте другую пару ( u , v ) . Поскольку u и v распределены равномерно и поскольку были допущены только точки внутри единичного круга, значения s будут также равномерно распределены в открытом интервале (0, 1) . В последнем можно убедиться, рассчитав кумулятивную функцию распределения для s в интервале (0, 1) . Это площадь круга радиусом , разделенный на . Отсюда мы находим, что функция плотности вероятности имеет постоянное значение 1 на интервале (0, 1) . Точно так же угол θ, разделенный на равномерно распределена в интервале [0, 1) и не зависит от s .
Теперь мы отождествляем значение s со значением U 1 и с U 2 в основной форме. Как показано на рисунке, значения и в основной форме можно заменить соотношениями и , соответственно. Преимущество состоит в том, что можно избежать прямого вычисления тригонометрических функций. Это полезно, когда вычисление тригонометрических функций обходится дороже, чем одно деление, заменяющее каждое из них.
Точно так же, как базовая форма дает два стандартных нормальных отклонения, так и этот альтернативный расчет. и
Противопоставление двух форм
[ редактировать ]Полярный метод отличается от базового метода тем, что является разновидностью браковочной выборки . Он отбрасывает некоторые сгенерированные случайные числа, но может быть быстрее, чем базовый метод, поскольку его проще вычислить (при условии, что генератор случайных чисел относительно быстр) и он более устойчив в числовом отношении. [ 9 ] Отказ от использования дорогостоящих тригонометрических функций повышает скорость по сравнению с базовой формой. [ 6 ] Он отбрасывает 1 - π /4 ≈ 21,46% от общего количества входных сгенерированных пар случайных чисел с равномерным распределением, т.е. отбрасывает 4/ π - 1 ≈ 27,32% пар равномерно распределенных случайных чисел на каждую гауссовских сгенерированную пару случайных чисел, требуя 4/ π ≈ 1,2732 входных данных. случайные числа для каждого выходного случайного числа.
Базовая форма требует двух умножений, 1/2 логарифма, 1/2 квадратного корня и одной тригонометрической функции для каждой нормальной переменной. [ 10 ] На некоторых процессорах косинус и синус одного и того же аргумента можно вычислить параллельно с помощью одной инструкции. В частности, для машин на базе процессоров Intel можно использовать инструкцию ассемблера fsincos или инструкцию expi (обычно доступную из C как встроенную функцию ) для вычисления сложных и просто разделите действительную и мнимую части.
Примечание: Чтобы явно вычислить комплексно-полярную форму, используйте следующие замены в общей форме:
Позволять и Затем
Полярная форма требует 3/2 умножения, 1/2 логарифма, 1/2 квадратного корня и 1/2 деления для каждой нормальной переменной. В результате одно умножение и одна тригонометрическая функция заменяются одним делением и условным циклом.
Усечение хвостов
[ редактировать ]Когда компьютер используется для создания однородной случайной величины, он неизбежно будет иметь некоторые неточности, поскольку существует нижняя граница того, насколько числа могут быть близки к 0. Если генератор использует 32 бита на выходное значение, это наименьшее ненулевое число, которое может быть сгенерировано . Когда и равны этому, преобразование Бокса-Мюллера дает нормальное случайное отклонение, равное . Это означает, что алгоритм не будет генерировать случайные величины со стандартными отклонениями более 6,660 от среднего значения. Это соответствует доле потеряно из-за усечения, где — стандартное кумулятивное нормальное распределение. При 64 битах предел увеличивается до стандартные отклонения, для которых .
Выполнение
[ редактировать ]С++
[ редактировать ]Стандартное преобразование Бокса-Мюллера генерирует значения из стандартного нормального распределения ( т.е. стандартных нормальных отклонений ) со средним значением 0 и стандартным отклонением 1 . Приведенная ниже реализация в стандарте C++ генерирует значения из любого нормального распределения со средним значением. и дисперсия . Если является стандартным нормальным отклонением, тогда будет иметь нормальное распределение со средним значением и стандартное отклонение . Генератор случайных чисел был создан для того, чтобы гарантировать, что новые псевдослучайные значения будут возвращаться в результате последовательных вызовов функции. generateGaussianNoise
функция.
#include <cmath>
#include <limits>
#include <random>
#include <utility>
//"mu" is the mean of the distribution, and "sigma" is the standard deviation.
std::pair<double, double> generateGaussianNoise(double mu, double sigma)
{
constexpr double two_pi = 2.0 * M_PI;
//initialize the random uniform number generator (runif) in a range 0 to 1
static std::mt19937 rng(std::random_device{}()); // Standard mersenne_twister_engine seeded with rd()
static std::uniform_real_distribution<> runif(0.0, 1.0);
//create two random numbers, make sure u1 is greater than zero
double u1, u2;
do
{
u1 = runif(rng);
}
while (u1 == 0);
u2 = runif(rng);
//compute z0 and z1
auto mag = sigma * sqrt(-2.0 * log(u1));
auto z0 = mag * cos(two_pi * u2) + mu;
auto z1 = mag * sin(two_pi * u2) + mu;
return std::make_pair(z0, z1);
}
JavaScript
[ редактировать ]function rand_normal() {
/* Syntax:
*
* [ x, y ] = rand_normal();
* x = rand_normal()[0];
* y = rand_normal()[1];
*
*/
// Box-Muller Transform:
let phi = 2 * Math.PI * Math.random();
let R = Math.sqrt( -2 * Math.log( Math.random() ) );
let x = R * Math.cos(phi);
let y = R * Math.sin(phi);
// Return values:
return [ x, y ];
}
Юлия
[ редактировать ]"""
boxmullersample(N)
Generate `2N` samples from the standard normal distribution using the Box-Muller method.
"""
function boxmullersample(N)
z = Array{Float64}(undef,N,2);
for i in axes(z,1)
z[i,:] .= sincospi(2 * rand());
z[i,:] .*= sqrt(-2 * log(rand()));
end
vec(z)
end
"""
boxmullersample(n,μ,σ)
Generate `n` samples from the normal distribution with mean `μ` and standard deviation `σ` using the Box-Muller method.
"""
function boxmullersample(n,μ,σ)
μ .+ σ*boxmullersample(cld(n,2))[1:n];
end
См. также
[ редактировать ]- Выборка обратного преобразования
- Полярный метод Марсальи , аналогичный преобразованию Бокса – Мюллера, который использует декартовы координаты вместо полярных координат.
Ссылки
[ редактировать ]- ^ Коробка, ГЭП; Мюллер, Мервин Э. (1958). «Заметки о генерации случайных нормальных отклонений» . Анналы математической статистики . 29 (2): 610–611. дои : 10.1214/aoms/1177706645 . JSTOR 2237361 .
- ^ Раймонд Э.А.К. Пейли и Норберт Винер Преобразования Фурье в комплексной области, Нью-Йорк: Американское математическое общество (1934) §37.
- ^ Клоден и Платен, Численные решения стохастических дифференциальных уравнений , стр. 11–12.
- ^ Хоуз, Ли; Томас, Дэвид (2008). GPU Gems 3 — Эффективная генерация случайных чисел и применение с использованием CUDA . Pearson Education, Inc. ISBN 978-0-321-51526-1 .
- ^ Шелдон Росс, Первый курс теории вероятностей , (2002), стр. 279–281.
- ^ Jump up to: а б Белл, Джеймс Р. (1968). «Алгоритм 334: Нормальные случайные отклонения» . Коммуникации АКМ . 11 (7): 498. дои : 10.1145/363397.363547 .
- ^ Кноп, Р. (1969). «Замечание к алгоритму 334 [G5]: Нормальные случайные отклонения» . Коммуникации АКМ . 12 (5): 281. дои : 10.1145/362946.362996 .
- ^ Кнут, Дональд (1998). Искусство компьютерного программирования: Том 2: Получисловые алгоритмы . п. 122. ИСБН 0-201-89684-2 .
- ^ Эверетт Ф. Картер-младший, Генерация и применение случайных чисел , Forth Dimensions (1994), Vol. 16, № 1 и 2.
- ^ Оценка 2 π U 1 считается за одно умножение, поскольку значение 2 π можно вычислить заранее и использовать повторно.