hmcSampler

Сэмплер Гамильтонова Монте-Карло (HMC)

Описание

пример

hmc = hmcSampler(logpdf,startpoint) создает сэмплер Гамильтонова Монте-Карло (HMC), возвращенный как HamiltonianSampler объект. logpdf указатель на функцию, который оценивает логарифм плотности вероятности распределения равновесия и его градиента. Вектор-столбец startpoint начальная точка, с которой можно запустить выборку HMC.

После того, как вы создадите сэмплер, можно вычислить MAP (максимум по опыту) точечные оценки, настроить сэмплер, чертить выборки и проверять диагностику сходимости с помощью методов HamiltonianSampler класс. Для примера этого рабочего процесса смотрите, что Байесова Линейная регрессия Использует гамильтонов Монте-Карло.

hmc = hmcSampler(___,Name,Value) задает дополнительные опции с помощью одного или нескольких аргументов пары "имя-значение". Задайте аргументы пары "имя-значение" после всех других входных параметров.

Примеры

свернуть все

Создайте сэмплер Гамильтонова Монте-Карло (HMC) к выборке от нормального распределения.

Во-первых, сохраните функциональный normalDistGrad на пути MATLAB®, который возвращает многомерную нормальную логарифмическую плотность вероятности и ее градиент (normalDistGrad задан в конце этого примера). Затем вызовите функцию с аргументами, чтобы задать logpdf входной параметр к hmcSampler функция.

means = [1;-3];
standevs = [1;2];
logpdf = @(theta)normalDistGrad(theta,means,standevs);

Выберите начальную точку для сэмплера HMC.

startpoint = randn(2,1);

Создайте сэмплер HMC и отобразите его свойства.

smp = hmcSampler(logpdf,startpoint);
smp
smp = 
  HamiltonianSampler with properties:

                  StepSize: 0.1000
                  NumSteps: 50
                MassVector: [2x1 double]
              JitterMethod: 'jitter-both'
      StepSizeTuningMethod: 'dual-averaging'
    MassVectorTuningMethod: 'iterative-sampling'
                    LogPDF: @(theta)normalDistGrad(theta,means,standevs)
             VariableNames: {2x1 cell}
                StartPoint: [2x1 double]

normalDistGrad функция возвращает логарифм многомерной нормальной плотности вероятности со средними значениями в Mu и стандартные отклонения в SigmaВ виде скаляров или столбцов векторизовал ту же длину как startpoint. Вторым выходным аргументом является соответствующий градиент.

function [lpdf,glpdf] = normalDistGrad(X,Mu,Sigma)
Z = (X - Mu)./Sigma;
lpdf = sum(-log(Sigma) - .5*log(2*pi) - .5*(Z.^2));
glpdf = -Z./Sigma;
end

Входные параметры

свернуть все

Логарифм целевой плотности и ее градиента в виде указателя на функцию.

logpdf должен возвратить два выходных аргумента: [lpdf,glpdf] = logpdf(X). Здесь, lpdf основная-e логарифмическая плотность вероятности (до аддитивной постоянной), glpdf градиент логарифмической плотности и точка X вектор-столбец с тем же числом элементов как startpoint.

Входной параметр X к logpdf должно быть неограничено, означая что каждый элемент X может быть любое вещественное число. Преобразуйте любого ограниченные параметры выборки в неограниченные переменные перед использованием сэмплера HMC.

Если 'UseNumericalGradient' значение установлено к true, затем logpdf не должен возвращать градиент как второй выход. Используя числовой градиент может быть легче начиная с logpdf не должен вычислять градиент, но он может сделать выборку медленнее.

Типы данных: function_handle

Начальная точка, чтобы начать производить от в виде числового вектор-столбца.

Типы данных: single | double

Аргументы name-value

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: 'VariableNames',{'Intercept','Beta'},'MassVectorTuningMethod','hessian' задает имена переменных выборки и массовый настраивающий метод вектора, чтобы быть 'hessian'.

Размер шага гамильтоновой динамики в виде разделенной запятой пары, состоящей из 'StepSize' и положительная скалярная величина.

Чтобы предложить новое состояние для Цепи Маркова, сэмплер HMC интегрирует гамильтонову динамику с помощью интегрирования чехарды. Этот аргумент управляет размером шага того интегрирования чехарды.

Можно автоматически настроить размер шага с помощью tuneSampler.

Пример: 'StepSize',0.2

Типы данных: single | double

Количество шагов гамильтоновой динамики в виде разделенной запятой пары, состоящей из 'NumSteps' и положительное целое число.

Чтобы предложить новое состояние для Цепи Маркова, сэмплер HMC интегрирует гамильтонову динамику с помощью интегрирования чехарды. Этот аргумент управляет количеством шагов того интегрирования чехарды.

Можно автоматически настроить количество шагов с помощью tuneSampler.

Пример: 'NumSteps',20

Типы данных: single | double

Массовый вектор из переменных импульса в виде разделенной запятой пары, состоящей из 'MassVector' и числовой вектор-столбец с положительными значениями и той же длиной как startpoint.

“Массы” переменных импульса, сопоставленных с переменными интереса, управляют гамильтоновой динамикой в каждом предложении по Цепи Маркова.

Можно автоматически настроить массовый вектор с помощью tuneSampler.

Пример: 'MassVector',rand(3,1)

Типы данных: single | double

Метод для дрожания размера шага и количества шагов в виде разделенной запятой пары, состоящей из 'JitterMethod' и одно из следующих значений.

ЗначениеОписание
'jitter-both'

Случайным образом дрожите размер шага и количество шагов для каждой траектории чехарды.

'jitter-numsteps'

Дрожание только количество шагов каждой траектории чехарды.

'none'

Не выполните дрожание.

С дрожанием сэмплер случайным образом выбирает размер шага или количество шагов каждой траектории чехарды как значения, меньшие, чем 'StepSize' и 'NumSteps' значения. Используйте дрожание, чтобы улучшить устойчивость интегрирования чехарды гамильтоновой динамики.

Пример: 'JitterMethod','jitter-both'

Метод для настройки размера шага сэмплера в виде разделенной запятой пары, состоящей из 'StepSizeTuningMethod' и 'dual-averaging' или 'none'.

Если 'StepSizeTuningMethod' значение установлено к 'dual-averaging', затем tuneSampler настраивает размер шага чехарды сэмплера HMC, чтобы достигнуть определенного приемного отношения для фиксированного значения продолжительности симуляции. Продолжительность симуляции равняется размеру шага, умноженному на количество шагов. Чтобы установить целевое приемное отношение, используйте 'TargetAcceptanceRatio' аргумент пары "имя-значение" tuneSampler метод.

Пример: 'StepSizeTuningMethod','none'

Метод для настройки вектора массы сэмплера в виде разделенной запятой пары, состоящей из 'MassVectorTuningMethod' и одно из следующих значений.

ЗначениеОписание
'iterative-sampling'

Настройте MassVector через последовательные приближения путем рисования выборок с помощью последовательности массовых векторных оценок.

'hessian'

Установите MassVector равняйтесь отрицательному диагональному Гессиану logpdf в startpoint.

'none'

Не выполните настройку MassVector.

Чтобы выполнить настройку, используйте tuneSampler метод.

Пример: 'MassVectorTuningMethod','hessian'

Отметьте для проверки аналитического градиента в виде разделенной запятой пары, состоящей из 'CheckGradient' и любой true (или 1) или false (или 0).

Если 'CheckGradient' true, затем сэмплер вычисляет числовой градиент в startpoint и сравнивает его с аналитическим градиентом, возвращенным logpdf.

Пример: 'CheckGradient',true

Выборка имен переменных в виде разделенной запятой пары, состоящей из 'VariableNames' и массив строк или массив ячеек из символьных векторов. Элементы массива должны быть уникальными. Длина массива должна совпасть с длиной startpoint.

Предоставьте 'VariableNames' значение, чтобы пометить компоненты вектора вы хотите к выборке с помощью сэмплера HMC.

Пример: 'VariableNames',{'Intercept','Beta'}

Типы данных: string | cell

Отметьте для использования числового градиента в виде разделенной запятой пары, состоящей из 'UseNumericalGradient' и любой true (или 1) или false (или 0).

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

Пример: 'UseNumericalGradient',true

Выходные аргументы

свернуть все

Гамильтонов сэмплер Монте-Карло, возвращенный как HamiltonianSampler объект.

Введенный в R2017a