exponenta event banner

drawSamples

Класс: HamiltonianSampler

Создание цепи Маркова с использованием гамильтонова Монте-Карло (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 образцов, попадающих в горение, и затем рисуя 2000 образцов.

Количество выгорающих образцов, отбрасываемых из начала цепи Маркова, указанное как положительное целое число.

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

Количество выборок, извлекаемых из цепи Маркова с помощью HMC-пробоотборника, указанное как положительное целое число.

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

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

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

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

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

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

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

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

Со значением, равным 0, drawSamples не отображает подробные данные при отборе проб.

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

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

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

Номер итерации

LOG PDF

Логарифмическая плотность вероятности при текущей итерации

STEP SIZE

Скачкообразный размер шага интеграции при текущей итерации. Размер шага может изменяться в зависимости от итераций.

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.

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