Коробка -маллер преобразование

The Box -Muller Transform , Джордж Эдвард Пелхэм Бокс и Мервин Эдгар Мюллер , [ 1 ] является методом отбора проб числа для генерации пар независимых , стандартных, обычно распределенных (нулевые ожидания единицы , дисперсия ), с учетом источника равномерно распределенных случайных чисел. Впервые этот метод был явно упомянут Рэймондом Эйком Пейли и Норбертом Винером в их трактате 1934 года о трансформациях Фурье в сложном домене. [ 2 ] Учитывая статус этих последних авторов и широко распространенную доступность и использование их трактата, почти уверен, что Box и Muller хорошо знали его содержимое.
Преобразование коробки -маллер обычно выражается в двух формах. Основная форма, заданная Box и Muller, берет два образца из равномерного распределения на интервале (0,1), и отображает их до двух стандартных, обычно распределенных образцов. Полярная форма берет два образца из другого интервала, [-1,+1] и отображает их на два нормально распределенных образца без использования синусоидальных или косинусных функций.
Преобразование коробки -маллера было разработано как более эффективная альтернатива методу отбора проб обратного преобразования . [ 3 ] Алгоритм Ziggurat дает более эффективный метод для скалярных процессоров (например, старые процессоры), в то время как преобразование коробки -шаллер является превосходным для процессоров с векторными единицами (например, графические процессоры или современные процессоры). [ 4 ]
Основная форма
[ редактировать ]Предположим, что U 1 и U 2 являются независимыми образцами, выбранными из равномерного распределения на единичном интервале (0, 1) . Позволять и
Тогда Z 0 и Z 1 являются независимыми случайными переменными со стандартным нормальным распределением .
Вывод [ 5 ] основан на свойстве двумерной декартовой системы , где координаты x и y описываются двумя независимыми и обычно распределенными случайными величинами, случайными переменными для R 2 и θ (показано выше) в соответствующих полярных координатах также независимы и могут быть выражены как и
Потому что р 2 является квадратом нормы стандартной двумерной нормальной переменной ( x , y ) , она имеет распределение хи-квадрат с двумя степенями свободы. В особом случае двух степеней свободы распределение хи-квадрат совпадает с экспоненциальным распределением и уравнением для R 2 Выше представляет собой простой способ создания требуемого экспоненциального вариата.
Полярная форма
[ редактировать ]
Полярная форма была впервые предложена Дж. Беллом [ 6 ] а затем модифицируется Р. Кнопом. [ 7 ] Хотя было описано несколько разных версий полярного метода, версия R. Knop будет описана здесь, потому что он наиболее широко используется, частично из -за ее включения в числовые рецепты . Немного другая форма описывается как «алгоритм P» Д. Кнута в искусстве компьютерного программирования . [ 8 ]
Учитывая U и V , независимое и равномерно распределено в замкнутом интервале [-1, +1] , установить s = r 2 = u 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% от общего входа, сгенерированных равномерно распределенных распределенных чисел, IE отбрасывает 4/ π - 1 ≈ 27,32% равномерно распределенные пары случайных чисел на гауссовые пары случайных чисел, сгенерированная, требуя 4/ π ≈ 1,2732 Случайные числа на вывод случайное число.
Основная форма требует двух умножений, 1/2 логарифма, 1/2 квадратного корня и одной тригонометрической функции для каждого нормального вариата. [ 10 ] На некоторых процессорах косинус и синус того же аргумента могут быть рассчитаны параллельно с помощью одной инструкции. Примечательно, что для машин на основе Intel можно использовать инструкцию Fsincos Assembler или инструкцию Expi (обычно доступную из C в качестве внутренней функции ), для расчета комплекса И просто разделить реальные и воображаемые части.
Примечание: Для явного расчета комплекс-полярной формы используйте следующие замены в общей форме,
Позволять и Затем
Полярная форма требует 3/2 умножения, 1/2 логарифма, 1/2 квадратного корня и 1/2 деления для каждого нормального вариата. Эффект состоит в том, чтобы заменить одно умножение и одну тригонометрическую функцию одним делением и условным циклом.
Усечение хвостов
[ редактировать ]Когда компьютер используется для создания равномерной случайной величины, он неизбежно будет иметь некоторые неточности, потому что существует более низкая граница о том, насколько близкие числа могут быть до 0. Если генератор использует 32 бит на выходное значение, наименьшее ненулевое число, которое может быть сгенерированным Полем Когда и равны этому, преобразование коробки -маллер дает нормальный случайный отклонение, равный Полем Это означает, что алгоритм не будет производить случайные переменные более 6,660 стандартных отклонений от среднего. Это соответствует долю потеряно из -за усечения, где это стандартное кумулятивное нормальное распределение. С 64 битами предел подталкивается к стандартные отклонения, для которых .
Выполнение
[ редактировать ]C ++
[ редактировать ]Стандартное преобразование коробки - маллинг генерирует значения из стандартного нормального распределения ( т.е. стандартные нормальные отклонения ) со средним 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
Смотрите также
[ редактировать ]- Обратная выборка преобразования
- Marsaglia Polar Method , аналогичный преобразованию с Box -Muller, который использует картезианские координаты вместо полярных координат
Ссылки
[ редактировать ]- ^ Коробка, gep; Мюллер, Мервин Э. (1958). «Примечание о генерации случайных нормальных отклонения» . Анналы математической статистики . 29 (2): 610–611. doi : 10.1214/AOMS/1177706645 . JSTOR 2237361 .
- ^ Raymond Eac Paley и Norbert Wiener Fourier Transfors в сложной области, Нью -Йорк: Американское математическое общество (1934) §37.
- ^ Kloeden и Platen, Численные растворы стохастических дифференциальных уравнений , с. 11–12
- ^ Хаус, Ли; Томас, Дэвид (2008). GPU GEMS 3 - Эффективное генерирование и применение случайных чисел с использованием CUDA . Pearson Education, Inc. ISBN 978-0-321-51526-1 .
- ^ Шелдон Росс, первый курс по вероятности , (2002), с. 279–281
- ^ Jump up to: а беременный Белл, Джеймс Р. (1968). «Алгоритм 334: нормальные случайные отклонения» . Коммуникации ACM . 11 (7): 498. doi : 10.1145/363397.363547 .
- ^ Knop, R. (1969). «Замечание об алгоритме 334 [G5]: нормальные случайные отклонения» . Коммуникации ACM . 12 (5): 281. DOI : 10.1145/362946.362996 .
- ^ Кнут, Дональд (1998). Искусство компьютерного программирования: Том 2: семинумеры алгоритмы . п. 122. ISBN 0-201-89684-2 .
- ^ Эверетт Ф. Картер -младший, Генерация и применение случайных чисел , Forth Dimensions (1994), vol. 16, № 1 и 2.
- ^ Оценка 2 π U 1 считается одним из умножений, поскольку значение 2 π может быть рассчитано заранее и используется неоднократно.