WikiDer > Метод псевдонима - Википедия
В вычисление, то псевдоним метод это семья эффективных алгоритмы за выборка из дискретного распределения вероятностей, благодаря А. Дж. Уокеру.[1][2] То есть возвращает целочисленные значения 1 ≤ я ≤ п согласно некоторому произвольному распределению вероятностей пя. Обычно в алгоритмах используются О(п бревно п) или же О(п) время предварительной обработки, по истечении которого случайные значения могут быть извлечены из распределения в О(1) время.[3]
Операция
Внутри алгоритм обращается к двум таблицам: вероятность стол Uя и таблица псевдонимов Kя (за 1 ≤ я ≤ п). Для получения случайного результата справедливый дис прокатывается для определения индекса в двух таблицах. На основе вероятности, хранящейся в этом индексе, предвзятая монета затем переворачивается, и результат переворота используется для выбора между результатом я и Kя.[4]
Более конкретно алгоритм работает следующим образом:
- Создать униформа случайное изменение 0 ≤ Икс < 1.
- Позволять я = ⌊nx⌋ + 1 и у = nx + 1 − я. (Это делает я равномерно распределены по {1, 2, …, п} и у равномерно распределены по [0, 1).)
- Если у < Uя, возвращаться я. Это предвзятое подбрасывание монеты.
- В противном случае вернуть Kя.
Альтернативная формулировка таблицы вероятностей, предложенная Marsaglia et. al.[5] в качестве метода «квадратной гистограммы» используется условие Икс < Vя на третьем этапе (где Vя = (Uя + я − 1)/п) вместо вычисления у.
Генерация таблиц
Распределение может быть дополнено дополнительными вероятностями пя = 0 увеличить п до удобного значения, например степени двойки.
Чтобы создать таблицу, сначала инициализируйте Uя = нпя. При этом разделите записи таблицы на три категории:
- Группа «переполненная», где Uя > 1,
- Группа «неполная», где Uя < 1 и Kя не был инициализирован, и
- «Точно полная» группа, где Uя = 1 или же Kя имеет был инициализирован.
Если Uя = 1, соответствующее значение Kя никогда не будут обсуждаться и неважно, но ценность Kя = я разумно.
Если не все записи таблицы полностью заполнены, повторите следующие шаги:
- Произвольно выбрать переполненную запись Uя > 1 и неполная запись Uj < 1. (Если один из них существует, другой также должен.)
- Выделите неиспользуемое пространство в записи j к результату я, установив Kj = я.
- Удалить выделенное пространство из записи я путем изменения Uя = Uя − (1 − Uj) = Uя + Uj − 1.
- Вход j теперь точно заполнено.
- Назначить запись я в соответствующую категорию на основе нового значения Uя.
Каждая итерация перемещает по крайней мере одну запись в категорию «точно полная» (а последняя перемещает две), поэтому процедура гарантированно завершится не позднее, чем через п−1 итераций. Каждую итерацию можно выполнить за О(1) время, поэтому стол может быть установлен в О(п) время.
Восе[3]:974 указывает, что ошибки округления с плавающей запятой могут привести к нарушению гарантии, упомянутой в шаге 1. Если одна категория опустеет раньше другой, оставшиеся записи могут иметь Uя установлен в 1 с незначительной ошибкой.
Структура псевдонима не уникальна.
Поскольку процедура поиска немного быстрее, если у < Uя (потому что Kя не нужно консультироваться), одна из целей при создании таблицы - максимизировать сумму Uя. Оказывается, что делать это оптимально NP жесткий,[5]:6 но жадный алгоритм достаточно близко: грабят самых богатых и раздают самым бедным. То есть на каждом шаге выбирайте самый большой Uя и самый маленький Uj. Потому что это требует сортировки Uя, это требует О(п бревно п) время.
Эффективность
Хотя метод псевдонима очень эффективен, если создание равномерного отклонения само по себе происходит быстро, бывают случаи, когда он далек от оптимального с точки зрения использования случайных битов. Это потому, что он использует случайную переменную полной точности Икс каждый раз, даже если нужно всего несколько случайных битов.
Один случай возникает, когда вероятности особенно хорошо сбалансированы, поэтому многие Uя = 1 и Kя не нужен. Создание у это пустая трата времени. Например, если п1 = п2 = 1⁄2, то 32-битная случайная переменная Икс можно использовать для выбора 32, но метод псевдонима сгенерирует только один.
Другой случай возникает, когда вероятности сильно несбалансированы, поэтому многие Uя ≈ 0. Например, если п1 = 0.999 и п2 = 0.001, то в подавляющем большинстве случаев требуется лишь несколько случайных битов, чтобы определить, применим ли случай 1. В таких случаях табличный метод, описанный Marsaglia et al.[5]:1–4 более эффективен. Если мы сделаем много вариантов с одинаковой вероятностью, нам может потребоваться в среднем гораздо меньше, чем один несмещенный случайный бит. С помощью арифметическое кодирование методов арифметики мы можем приблизиться к пределу, заданному бинарная функция энтропии.
Литература
- Дональд Кнут, Искусство программирования, Том 2: Получисленные алгоритмы, раздел 3.4.1.
Реализации
- http://www.keithschwarz.com/darts-dice-coins/ Кейт Шварц: подробное объяснение, численно стабильная версия алгоритма Восе и ссылка на реализацию Java
- http://apps.jcns.fz-juelich.de/ransampl Иоахим Вуттке: Реализация в виде небольшой библиотеки C.
- https://gist.github.com/0b5786e9bfc73e75eb8180b5400cd1f8 Реализация Лиама Хуанга на C ++
- https://github.com/joseftw/jos.weightedresult/blob/develop/src/JOS.WeightedResult/AliasMethodVose.cs C # реализация алгоритма Восе.
Рекомендации
- ^ Уокер, А. Дж. (Апрель 1974 г.). «Новый быстрый метод генерации дискретных случайных чисел с произвольным частотным распределением». Письма об электронике. 10 (8): 127. Дои:10.1049 / el: 19740097.
- ^ Уокер, А. Дж. (Сентябрь 1977 г.). «Эффективный метод генерации дискретных случайных величин с общими распределениями». Транзакции ACM на математическом ПО. 3 (3): 253–256. Дои:10.1145/355744.355749.
- ^ а б Восе, Майкл Д. (сентябрь 1991 г.). «Линейный алгоритм генерации случайных чисел с заданным распределением» (PDF). IEEE Transactions по разработке программного обеспечения. 17 (9): 972–975. CiteSeerX 10.1.1.398.3339. Дои:10.1109/32.92917. Архивировано из оригинал (PDF) на 2013-10-29.CS1 maint: ref = harv (связь)
- ^ «Дартс, кости и монеты: выборка из дискретного распределения». KeithSchwarz.com. 29 декабря 2011 г.. Получено 2011-12-27.
- ^ а б c Марсалья, Джордж; Цанг, Вай Ван; Ван, Цзинбо (2004-07-12), "Быстрая генерация дискретных случайных величин", Журнал статистического программного обеспечения, 11 (3): 1–11, Дои:10.18637 / jss.v011.i03