Для более комплексных распределений вероятностей вам может быть нужно больше передовых методов для генерации выборок, чем методы, описанные в общих Методах Генерации Псевдослучайного числа. Такие дистрибутивы возникают, например, в Байесовом анализе данных и в больших комбинаторных проблемах симуляций Цепи Маркова Монте-Карло (MCMC). Альтернатива должна создать Цепь Маркова со стационарным распределением, равным целевому распределению выборки, с помощью состояний цепочки, чтобы сгенерировать случайные числа после начальной электротермотренировки, в которой распределенность сходится к цели.
Алгоритм Гастингса Столицы чертит выборки от распределения, которое только известно до константы. Случайные числа сгенерированы от распределения с функцией плотности вероятности, которая равна или пропорциональна функции предложения.
Сгенерировать случайные числа:
Примите начальное значение x (t).
Чертите выборку, y (t), от распределения предложения q (y |x (t)).
Примите y (t) как следующий демонстрационный x (t + 1) с вероятностью r (x (t), y (t)), и сохраните x (t) как следующий демонстрационный x (t + 1) с вероятностью 1 – r (x (t), y (t)), где:
Постепенно увеличьте t → t + 1, и повторные шаги 2 и 3, пока вы не получите желаемое количество выборок.
Сгенерируйте случайные числа с помощью метода Гастингса Столицы с функцией mhsample
. Чтобы произвести качественные выборки эффективно с алгоритмом Гастингса Столицы, крайне важно выбрать хорошее распределение предложения. Если трудно найти эффективное распределение предложения, используйте срез, выбирающий (slicesample
) или гамильтонов Монте-Карло (hmcSampler
) вместо этого.
В экземплярах, где трудно найти эффективное распределение предложения Гастингса Столицы, алгоритм выборки среза не требует явной спецификации. Алгоритм выборки среза чертит выборки из области под функцией плотности с помощью последовательности вертикальных и горизонтальных шагов. Во-первых, это выбирает высоту наугад от 0 до функции плотности f (x). Затем это выбирает новое x значение наугад путем выборки от горизонтального “среза” плотности выше выбранной высоты. Подобный алгоритм выборки среза используется для многомерного распределения.
Если функция f (x) пропорциональный функции плотности дана, то сделайте следующее, чтобы сгенерировать случайные числа:
Примите начальное значение x (t) в области f (x).
Чертите действительное значение y однородно от (0, f (x (t))), таким образом, задавая горизонтальный “срез” как S = {x: y <f (x)}.
Найдите интервал I = (L, R) вокруг x (t), который содержит все или большую часть “среза” S.
Чертите новую точку x (t + 1) в этом интервале.
Постепенно увеличьте t → t + 1 и повторные шаги 2 - 4, пока вы не получите желаемое количество выборок.
Выборка среза может сгенерировать случайные числа от распределения с произвольной формой функции плотности, при условии, что эффективная числовая процедура доступна, чтобы найти интервал I = (L, R), который является “срезом” плотности.
Сгенерируйте случайные числа с помощью метода выборки среза с функцией slicesample
.
Гастингс столицы и выборка среза могут произвести цепочки MCMC, которые медленно смешиваются и занимают много времени, чтобы сходиться к стационарному распределению, особенно в средних размерных и высоко-размерных проблемах. Используйте основанный на градиенте сэмплер Гамильтонова Монте-Карло (HMC), чтобы ускорить выборку в этих ситуациях.
Чтобы использовать выборку HMC, необходимо задать, регистрируют f(x) (до аддитивной постоянной) и ее градиент. Можно использовать числовой градиент, но это приводит к более медленной выборке. Все переменные выборки должны быть неограничены, означая, которые регистрируют f(x), и его градиент четко определены для всего действительного x. К ограниченным переменным выборки преобразуйте эти переменные в неограниченные единицы перед использованием сэмплера HMC.
Алгоритм выборки HMC вводит случайный “вектор импульса” z и задает объединенную плотность z и “радиус-вектора” x как P(x,z) = f(x)g(z). Цель состоит в том, чтобы выбрать от этого совместного распределения и затем проигнорировать значения z — предельное распределение x имеет желаемую плотность f(x).
Алгоритм HMC присваивает Гауссову плотность с ковариационной матрицей M (“большая матрица”) к z:
Затем это задает “энергетическую функцию” как
с U(x) = – регистрируют f(x) “потенциальная энергия” и K(z) = zTM-1z/2 “кинетическая энергия”. Объединенная плотность дана P(x,z) ∝ exp {-E(x,z)}.
Сгенерировать случайные выборки, алгоритм HMC:
Принимает начальное значение x радиус-вектора.
Генерирует выборку вектора импульса: z ∼ g(z).
Развивает (x, z) состояния для некоторой суммы фиктивного времени τ к новому (x’,z’) состояния с помощью “уравнений движения”:
Если бы уравнения движения могли бы быть решены точно, энергия (и следовательно плотность) осталась бы постоянной: E(x,z) = E(x’,z’). На практике уравнения движений должны быть решены численно (обычно использующий так называемое интегрирование чехарды), и энергия не сохраняется.
Принимает x’ как следующую выборку с вероятностью p acc = min (1, exp {E(x,z) – E(x’,z’)}), и сохраняет x как следующую выборку с вероятностью 1 – p acc.
Шаги 2 - 4 повторений, пока это не сгенерировало желаемое количество выборок.
Чтобы использовать выборку HMC, создайте сэмплер с помощью функции hmcSampler
. После создания сэмплера можно вычислить MAP (максимум по опыту) точечные оценки, настроить сэмплер, чертить выборки и проверять диагностику сходимости. Для примера этого рабочего процесса смотрите, что Байесова Линейная регрессия Использует гамильтонов Монте-Карло.