Jump to content

Алгоритм зиккурата

Алгоритм зиккурата — это алгоритм выборки псевдослучайных чисел . Принадлежащий к классу алгоритмов выборки отклонения , он опирается на базовый источник равномерно распределенных случайных чисел, обычно получаемых из генератора псевдослучайных чисел , а также на предварительно вычисленные таблицы. Алгоритм используется для генерации значений из монотонно убывающего распределения вероятностей . Его также можно применить к симметричным унимодальным распределениям , таким как нормальное распределение , выбирая значение из одной половины распределения, а затем случайным образом выбирая, какая половина значения считается полученной. Он был разработан Джорджем Марсальей и другими в 1960-х годах.

Типичное значение, полученное с помощью алгоритма, требует создания только одного случайного значения с плавающей запятой и одного случайного индекса таблицы, за которым следуют один поиск в таблице, одна операция умножения и одно сравнение. Иногда (2,5% случаев, в случае нормального или экспоненциального распределения при использовании типичных размеров таблиц) [ нужна ссылка ] требуются дополнительные вычисления. Тем не менее, алгоритм вычислительно намного быстрее. [ нужна ссылка ] чем два наиболее часто используемых метода генерации нормально распределенных случайных чисел, полярный метод Марсальи и преобразование Бокса-Мюллера , которые требуют по крайней мере одного логарифма и одного вычисления квадратного корня для каждой пары сгенерированных значений. Однако, поскольку алгоритм зиккурата более сложен в реализации, его лучше всего использовать, когда требуется большое количество случайных чисел.

Термин «алгоритм зиккурата» восходит к статье Марсальи и Вай Ван Цанга в 2000 году; он назван так потому, что концептуально основан на покрытии распределения вероятностей прямоугольными сегментами, сложенными в порядке убывания размера, в результате чего получается фигура, напоминающая зиккурат .

Алгоритм Зиккурата, используемый для генерации выборочных значений с нормальным распределением . (Для простоты показаны только положительные значения.) Розовые точки представляют собой изначально равномерно распределенные случайные числа. Искомая функция распределения сначала сегментируется на равные площади «А». Один слой i выбирается случайным образом однородным источником слева. Затем случайное значение из верхнего источника умножается на ширину выбранного слоя, и результат проверяется по x, чтобы увидеть, в какую область слоя оно попадает, с тремя возможными результатами: 1) (слева, сплошная черная область) образец явно находится под кривой и может быть выведен немедленно. 2) (справа, область с вертикальной полосой) значение выборки может лежать под кривой и должно быть проверено дальше. случайное значение y В этом случае генерируется внутри выбранного слоя и сравнивается с f(x) . Если меньше, точка находится под кривой и значение x выводится . В противном случае (третий случай) выбранная точка x отклоняется и алгоритм перезапускается с начала.

Теория работы

[ редактировать ]

Алгоритм зиккурата представляет собой алгоритм отбраковки выборки; он случайным образом генерирует точку в распределении, немного превышающем желаемое распределение, а затем проверяет, находится ли сгенерированная точка внутри желаемого распределения. Если нет, он пытается еще раз. Учитывая случайную точку под кривой плотности вероятности, ее координата x представляет собой случайное число с желаемым распределением.

Распределение, которое выбирает алгоритм зиккурата, состоит из n областей равной площади; n - 1 прямоугольников, покрывающих большую часть желаемого распределения, поверх непрямоугольного основания, включающего хвост распределения.

Учитывая монотонно убывающую функцию плотности вероятности f ( x ), определенную для всех x ≥ 0, основание зиккурата определяется как все точки внутри распределения и ниже y 1 = f ( x 1 ). Оно состоит из прямоугольной области от (0, 0) до ( x 1 , y 1 ) и (обычно бесконечного) хвоста распределения, где x > x 1 y < y 1 ).

Этот слой (назовем его слоем 0) имеет A. площадь Поверх этого добавьте прямоугольный слой шириной x 1 и высотой A / x 1 также имел площадь A. , чтобы он Вершина этого слоя находится на высоте y 2 = y 1 + A / x 1 и пересекает функцию плотности в точке ( x 2 , y 2 ), где y 2 = f ( x 2 ). Этот слой включает в себя каждую точку функции плотности между y 1 и y 2 , но (в отличие от базового слоя) также включает такие точки, как ( x 1 , y 2 ), которые не входят в желаемое распределение.

Затем сверху укладываются следующие слои. Чтобы использовать предварительно вычисленную таблицу размера n ( обычно n = 256), выбирают x 1 так, что x n = 0, что означает, что верхний блок, слой n - 1, достигает пика распределения в (0, f (0) ) точно.

Слой i простирается вертикально от y i до y i +1 и может быть разделен на две области по горизонтали: (обычно большую) часть от 0 до xi , +1 которая полностью содержится в желаемом распределении, и (маленькую) часть. от x i +1 до x i , который содержится лишь частично.

Игнорируя на мгновение проблему слоя 0 и учитывая однородные случайные величины U 0 и U 1 ∈ [0,1), алгоритм зиккурата можно описать как:

  1. Выберите случайный слой 0 ≤ i < n .
  2. Пусть Икс знак равно U 0 Икс я .
  3. Если x < x i +1 , верните x .
  4. Пусть y = y i + U 1 ( y i +1 - y i ).
  5. Вычислите f ( x ). Если y < f ( x ), верните x .
  6. В противном случае выберите новые случайные числа и вернитесь к шагу 1.

с низким разрешением Шаг 1 сводится к выбору координаты Y . Шаг 3 проверяет, находится ли координата x в пределах желаемой функции плотности, не зная больше о координате y. Если это не так, на шаге 4 выбирается координата Y с высоким разрешением, а на шаге 5 выполняется тест отбраковки.

При близко расположенных слоях алгоритм завершается на шаге 3 в очень большой части времени. для верхнего слоя n Однако − 1 этот тест всегда не пройден, поскольку x n = 0.

Слой 0 также можно разделить на центральную область и край, но край представляет собой бесконечный хвост. Чтобы использовать тот же алгоритм для проверки того, находится ли точка в центральной области, сгенерируйте фиктивный x 0 = A / y 1 . Это будет генерировать точки с x < x 1 с правильной частотой, и в том редком случае, когда выбран слой 0 и x x 1 , используется специальный резервный алгоритм для случайного выбора точки из хвоста. Поскольку резервный алгоритм используется реже, чем один раз из тысячи, скорость не имеет существенного значения.

Таким образом, полный алгоритм зиккурата для односторонних распределений выглядит так:

  1. Выберите случайный слой 0 ≤ i < n .
  2. Пусть x = U 0 x i
  3. Если x < x i +1 , верните x .
  4. Если i = 0, сгенерируйте точку из хвоста, используя резервный алгоритм.
  5. Пусть y = y i + U 1 ( y i +1 - y i ).
  6. Вычислите f ( x ). Если y < f ( x ), верните x .
  7. В противном случае выберите новые случайные числа и вернитесь к шагу 1.

Для двустороннего распределения результат должен быть отрицательным в 50% случаев. Часто это можно сделать удобно, выбрав U 0 ∈ (−1,1) и на шаге 3 проверив, | х | < Икс я +1 .

Алгоритмы отката для хвоста

[ редактировать ]

Поскольку алгоритм зиккурата генерирует большую часть выходных данных очень быстро и требует резервного алгоритма всякий раз, когда x > x 1 , он всегда более сложен, чем более прямая реализация. Конкретный алгоритм возврата зависит от распределения.

Для экспоненциального распределения хвост выглядит так же, как тело распределения. Один из способов — вернуться к самому элементарному алгоритму E = −ln( U 1 ) и положить x = x 1 − ln( U 1 ). вызвать алгоритм зиккурата Другой способ — рекурсивно и добавить x 1 к результату .

Для нормального распределения Марсалья предлагает компактный алгоритм:

  1. Пусть x = −ln( U 1 )/ x 1 .
  2. Пусть y −ln( U2 = ).
  3. Если 2 у > х 2 , верните х + х 1 .
  4. В противном случае вернитесь к шагу 1.

Поскольку x 1 ≈ 3,5 для типичных размеров таблиц, тест на шаге 3 почти всегда оказывается успешным. Поскольку −ln( U 1 ) является экспоненциально распределенной переменной, можно использовать реализацию экспоненциального распределения.

Оптимизации

[ редактировать ]

Алгоритм может быть эффективно реализован с предварительно вычисленными таблицами x i и y i = f ( x i ), но есть некоторые модификации, которые сделают его еще быстрее:

  • Ничто в алгоритме зиккурата не зависит от нормируемой функции распределения вероятностей (интеграл под кривой, равный 1), удаление нормализующих констант может ускорить вычисление f ( x ).
  • Большинство однородных генераторов случайных чисел основаны на генераторах целочисленных случайных чисел, которые возвращают целое число в диапазоне [0, 2 32 − 1]. Стол из 2 человек −32 x i позволяет использовать такие числа непосредственно для U 0 .
  • При вычислении двусторонних распределений с использованием двустороннего U 0, как описано ранее, случайное целое число можно интерпретировать как число со знаком в диапазоне [−2 31 , 2 31 − 1] и масштабный коэффициент 2 −31 можно использовать.
  • Вместо того, чтобы сравнивать U 0 x i с x i +1 на этапе 3, можно предварительно вычислить x i +1 / x i и сравнить U 0 с этим напрямую. Если U 0 — генератор целочисленных случайных чисел, эти пределы можно предварительно умножить на 2. 32 (или 2 31 , при необходимости), поэтому можно использовать целочисленное сравнение.
  • После двух вышеуказанных изменений таблица неизмененных xi значений больше не нужна и может быть удалена.
  • При генерации значений с плавающей запятой одинарной точности IEEE 754 , которые имеют только 24-битную мантиссу (включая неявную ведущую 1), младшие биты 32-битного целого случайного числа не используются. Эти биты могут использоваться для выбора номера слоя. (Подробное обсуждение этого вопроса см. в ссылках ниже.)
  • Первые три шага можно поместить во встроенную функцию , которая может вызывать внешнюю реализацию менее часто необходимых шагов.

Создание таблиц

[ редактировать ]

Можно сохранить всю предварительно вычисленную таблицу или просто включить значения n , y1 . , A и реализацию f  −1 ( y ) в исходном коде и вычислите оставшиеся значения при инициализации генератора случайных чисел.

Как описано ранее, вы можете найти x i = f  −1 ( y я ) и y я +1 знак равно y я + А / Икс я . Повторите n − 1 раз для слоев зиккурата. В конце у вас должно получиться y n = f (0). Будет некоторая ошибка округления , но это полезная проверка работоспособности, позволяющая убедиться, что она приемлемо мала.

При фактическом заполнении значений таблицы просто предположите, что x n = 0 и y n = f (0), и примите небольшую разницу в площади слоя n - 1 как ошибку округления.

Нахождение x 1 и A

[ редактировать ]

Учитывая начальное (угадайте) x 1 , вам нужен способ вычислить площадь t хвоста, для которого x > x 1 . Для экспоненциального распределения это просто e х 1 , а для нормального распределения, предполагая, что вы используете ненормализованное f ( x ) = e х 2 /2 , это π /2 erfc ( x / 2 ). Для более неудобных распределений численное интегрирование может потребоваться .

Имея это в виду, из x 1 вы можете найти y 1 = f ( x 1 ), площадь t в хвосте и площадь базового слоя A = x 1 y 1 + t .

Затем вычислите ряды y i и xi , как указано выше. Если y i > f (0) для любого i < n оценка x 1 была слишком низкой, что приводило к слишком большой площади A. , то первоначальная Если y n < f (0), то первоначальная оценка x 1 была слишком высокой.

Учитывая это, используйте алгоритм поиска корня (например, метод деления пополам ), чтобы найти значение x 1 , которое дает y n −1 как можно ближе к f (0). В качестве альтернативы найдите значение, которое делает площадь самого верхнего слоя x n -1 ( f (0) - y n -1 близкой к желаемому значению A. ) максимально Это экономит одну оценку f  −1 ( x ) и на самом деле представляет наибольший интерес.

Вариант Макфарланда

[ редактировать ]

Кристофер Д. Макфарланд предложил еще более оптимизированную версию. [1] При этом применяются три алгоритмических изменения за счет немного большего размера таблиц.

Во-первых, в общем случае рассматриваются только прямоугольные части от (0, y i −1 ) до ( xi , . y i ). Области нечетной формы справа от них (в основном почти треугольные, плюс хвост) обрабатываются отдельно . алгоритма Это упрощает и ускоряет работу .

Во-вторых, используется точная площадь областей нестандартной формы; они не округляются в большую сторону, чтобы включить весь прямоугольник до ( x i −1 , y i ). Это увеличивает вероятность того, что будет использован быстрый путь.

Одним из основных последствий этого является то, что количество слоев немного меньше n . Несмотря на то, что площадь частей нестандартной формы взята точно, общая сумма составляет более одного слоя. Площадь каждого слоя регулируется таким образом, чтобы количество прямоугольных слоев было целым числом. Если исходное 0 ≤ i < n превышает количество прямоугольных слоев, продолжается этап 2.

Если искомое значение лежит в какой-либо из областей нечетной формы, метод псевдонима используется для выбора одной из них на основе ее истинной площади. Это небольшой объем дополнительной работы, требующий дополнительных таблиц псевдонимов, но при этом выбирается одна из правых сторон слоев.

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

В-третьих, используется почти треугольная форма большинства участков нечетной формы, хотя ее необходимо разделить на три случая в зависимости от второй производной функции распределения вероятностей в выбранном слое.

Если функция выпуклая (поскольку экспоненциальное распределение есть везде, а нормальное распределение — для | x | > 1), то функция строго содержится внутри нижнего треугольника. два единичных однородных отклонения U 1 и U 2 Выбираются , и перед их масштабированием до прямоугольника, охватывающего область нечетной формы, проверяется их сумма. Если U 1 + U 2 > 1, точка находится в верхнем треугольнике и может быть отражена в (1 − U 1 , 1 − U 2 ). Тогда, если U 1 + U 2 < 1− ε , для некоторого подходящего допуска ε точка определенно находится ниже кривой и может быть немедленно принята. Только для точек, очень близких к диагонали, необходимо вычислить функцию распределения f ( x ), чтобы выполнить точный тест отбраковки. (Теоретически допуск ε должен зависеть от слоя, но одно максимальное значение можно использовать для всех слоев с небольшими потерями.)

Если функция вогнутая (как нормальное распределение для | x | < 1), она включает в себя небольшую часть верхнего треугольника, поэтому отражение невозможно, но точки, нормализованные координаты которых удовлетворяют U 1 + U 2 ≤ 1, могут быть немедленно приняты. , а точки, для которых U 1 + U 2 > 1+ ε, можно сразу отбросить.

В одном слое, охватывающем | х | = 1, нормальное распределение имеет точку перегиба, и критерий точного отклонения необходимо применять, если 1− ε < U 1 + U 2 < 1+ ε .

Хвост обрабатывается так же, как в оригинальном алгоритме Зиккурата, и его можно рассматривать как четвертый случай формы области нечетной формы справа.

  1. ^ Макфарланд, Кристофер Д. (24 июня 2015 г.). «Модифицированный алгоритм зиккурата для генерации экспоненциально и нормально распределенных псевдослучайных чисел» . Журнал статистических вычислений и моделирования . 86 (7): 1281–1294. arXiv : 1403.6870 . дои : 10.1080/00949655.2015.1060234 . Обратите внимание, что репозиторий Bitbucket , упомянутый в статье, больше недоступен, и код теперь находится по адресу https://github.com/cd-mcfarland/fast_prng.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 3e9d3818be0f6d8fc1e5926654d05dc4__1720579620
URL1:https://arc.ask3.ru/arc/aa/3e/c4/3e9d3818be0f6d8fc1e5926654d05dc4.html
Заголовок, (Title) документа по адресу, URL1:
Ziggurat algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)