drawSamples

Класс: HamiltonianSampler

Сгенерируйте марковскую цепь, используя гамильтоновый Monte Carlo (HMC)

Синтаксис

chain = drawSamples(smp)
[chain,endpoint,accratio] = drawSamples(smp)
[chain,endpoint,accratio] = drawSamples(___,Name,Value)

Описание

chain = drawSamples(smp) генерирует цепь Маркова путем рисования выборок с помощью гамильтоновского сэмплера Монте-Карло smp.

[chain,endpoint,accratio] = drawSamples(smp) также возвращает окончательное состояние цепи Маркова в endpoint и часть принятых предложений в accratio.

[chain,endpoint,accratio] = drawSamples(___,Name,Value) задает дополнительные опции, используя один или несколько аргументы пары "имя-значение". Задайте аргументы пары "имя-значение" после всех других входных параметров.

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

расширить все

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

drawSamples отбирает выборки из целевой логарифмической плотности вероятностей в smp.LogPDF. Используйте hmcSampler функция для создания дискретизатора.

Аргументы в виде пар имя-значение

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

Пример: 'Burnin',500,'NumSamples',2000 генерирует марковскую цепь путем отбрасывания 500 burn-in выборок и последующего рисования 2000 выборок.

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

Пример: 'Burnin',500

Количество выборок для извлечения из марковской цепи с использованием HMC-сэмплера, заданное в виде положительного целого числа.

The drawSamples способ генерирует это количество выборок после периода горения.

Пример: 'NumSamples',2000

Размер утончения марковской цепи, заданный как положительное целое число.

Только один из 'ThinSize' выдерживают количество выборок. Остальные выборки отбрасываются.

Пример: 'ThinSize',5

Начальная точка для начала выборки, заданная как числовой вектор-столбец с таким же количеством элементов, как и StartPoint свойство дискретизатора smp.

Пример: 'StartPoint',randn(5,1)

Уровень подробностей окна Command Window во время дискретизации, заданный как 0 или положительное целое число.

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

С заданным значением положительного целого числа, drawSamples отображает подробную информацию о выборке. Чтобы задать частоту выхода, используйте 'NumPrint' аргумент пары "имя-значение".

drawSamples отображает выход в виде таблицы с этими столбцами.

ЗаголовокОписание
ITER

Число итерации

LOG PDF

Журнал плотности вероятностей при текущей итерации

STEP SIZE

Размер шага интегрирования Leapfrog при текущей итерации. Если размер шага джиттерирован, он может варьироваться между итерациями.

NUM STEPS

Количество шагов интегрирования чехарды на текущей итерации. Если количество шагов джиттерировано, это может варьироваться между итерациями

ACC RATIO

Коэффициент принятия, то есть доля предложений, которые принимаются. Коэффициент приемки рассчитывается с начала отбора проб, включая период горения.

DIVERGENT

Количество случаев, когда семплер не смог сгенерировать допустимое предложение из-за генерации итераций чехарды NaNs или Infs. При рисовании выборок значение в DIVERGENT столбец указывает, что выбранный размер шага выше порога устойчивости для некоторой области пространства состояний. Чтобы устранить эту проблему, попробуйте задать StepSize к меньшему значению, нарисуйте новые выборки и проверьте, что все значения в DIVERGENT столбец равен 0.

Пример: 'VerbosityLevel',1

Подробная выходная частота, заданная как положительное целое число.

Если на 'VerbosityLevel' значение является положительным целым числом, тогда drawSamples выводит детали выборки каждый 'NumPrint' итераций.

Пример: 'NumPrint',200

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

расширить все

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

Каждая строка chain является выборкой, и каждый столбец представляет одну переменную выборки.

Окончательное состояние марковской цепи, возвращаемое как числовой вектор-столбец той же длины, что и smp.StartPoint.

Коэффициент принятия предложений цепочки Маркова, возвращенный как числовой скаляр. Коэффициент приемки рассчитывается с начала отбора проб, включая период горения.

Примеры

расширить все

Создайте цепи MCMC для многомерного нормального распределения с помощью гамильтонового сэмплера Монте-Карло (HMC).

Определите количество параметров для выборки и их средства.

NumParams = 100;
means = randn(NumParams,1);
standevs = 0.1;

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

logpdf = @(theta)normalDistGrad(theta,means,standevs);

Выберите начальную точку дискретизатора. Создайте HMC-дискретизатор и настройте его параметры.

startpoint = randn(NumParams,1);
smp = hmcSampler(logpdf,startpoint);
smp = tuneSampler(smp);

Нарисуйте выборки из апостериорной плотности, используя несколько независимых цепей. Выберите различные, случайным образом распределенные начальные точки для каждой цепи. Укажите количество выборок горения, которые нужно сбросить с начала марковской цепи, и количество выборок, которые будут сгенерированы после горения. Установите 'VerbosityLevel' для печати подробных данных во время выборки для первой цепи.

NumChains  = 4;
chains     = cell(NumChains,1);
Burnin     = 500;
NumSamples = 2000;
for c = 1:NumChains
    if c == 1
        showOutput = 1;
    else
        showOutput = 0;
    end
    chains{c} = drawSamples(smp,'Burnin',Burnin,'NumSamples',NumSamples,...
        'Start',randn(size(startpoint)),'VerbosityLevel',showOutput,'NumPrint',500);
end
|==================================================================================|
|   ITER   |    LOG PDF    |  STEP SIZE  |  NUM STEPS  |  ACC RATIO  |  DIVERGENT  |
|==================================================================================|
|      500 |  8.450463e+01 |   4.776e-01 |           5 |   9.060e-01 |           0 |
|     1000 |  8.034444e+01 |   4.776e-01 |           9 |   8.810e-01 |           0 |
|     1500 |  9.156276e+01 |   4.776e-01 |           2 |   8.867e-01 |           0 |
|     2000 |  8.027782e+01 |   2.817e-02 |           6 |   8.890e-01 |           0 |
|     2500 |  9.892440e+01 |   4.648e-01 |           2 |   8.904e-01 |           0 |

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

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

for p = 1:3
    subplot(3,1,p);
    plot(chains{1}(:,p));
    ylabel(smp.VariableNames(p))
    axis tight
end
xlabel('Iteration')

Figure contains 3 axes. Axes 1 contains an object of type line. Axes 2 contains an object of type line. Axes 3 contains an object of type line.

The 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

Совет

Введенный в R2017a