Справка по API
Моделирование
#
DynamicPPL.@model — Macro
@model(expr[, warn = false])
Макрос для задания вероятностной модели.
Если warn имеет значение true, выводится предупреждение, когда в определении модели используются имена внутренних переменных.
Примеры
Определение модели:
@model function model(x, y = 42)
...
end
Для создания модели Model следует вызывать model(xvalue) или model(xvalue, yvalue).
Сэмплеры
#
DynamicPPL.Sampler — Type
Sampler{T}
Универсальный тип сэмплера для алгоритмов вывода типа T в DynamicPPL.
Сэмплер (Sampler) должен реализовывать интерфейс AbstractMCMC, и, в частности, AbstractMCMC.step. Имеется заданная по умолчанию реализация начального шага выборки, которая поддерживает возобновление выборки из предыдущего состояния и задание начальных значений параметров. Она требует перегрузки loadstate и initialstep для загрузки предыдущих состояний и собственно выполнения начального шага выборки, соответственно. Кроме того, иногда может потребоваться реализовать initialsampler, который определяет, как будет осуществляться выборка начальных значений параметров, если они не заданы. По умолчанию значения выбираются из априорного распределения.
#
Turing.Inference.Gibbs — Type
Gibbs(algs...)
Составной интерфейс MCMC. Выборка Гиббса объединяет один или несколько алгоритмов выборки, каждый из которых делает выборку из разного набора переменных в модели.
Пример:
@model function gibbs_example(x)
v1 ~ Normal(0,1)
v2 ~ Categorical(5)
end
# Используем PG для переменной 'v2' и используем HMC для переменной 'v1'.
# Обратите внимание, что v2 дискретна, поэтому сэмплер PG подходит больше,
# чем HMC.
alg = Gibbs(HMC(0.2, 3, :v1), PG(20, :v2))
Можно также передать количество итераций для каждого компонента Гиббса, используя следующий синтаксис:
-
alg = GibbsHMC(0.2, 3, :v1), n_hmc), (PG(20, :v2), n_pg
где n_hmc и n_pg — это количество итераций HMC и PG для каждой итерации Гиббса.
Советы:
-
HMCиNUTSявляются быстрыми сэмплерами и могут отбрасывать методы, основанные на частицах,
такие как метод Гиббса на основе частиц. Вы можете повысить эффективность выборки частиц, включив больше частиц в сэмплер частиц.
#
Turing.Inference.HMC — Type
HMC(ϵ::Float64, n_leapfrog::Int)
Сэмплер гамильтониана Монте-Карло со статической траекторией.
Аргументы:
-
ϵ::Float64: используемый размер шага с перешагиванием. -
n_leapfrog::Int: количество используемых шагов с перешагиванием.
Использование:
HMC(0.05, 10)
Советы:
-
Если вы получаете ошибки градиента при использовании
HMC, попробуйте уменьшить размер шага с перешагиваниемϵ, как показано далее:
# Исходный размер шага
sample(gdemo([1.5, 2]), HMC(0.1, 10), 1000)
# Сокращенный размер шага
sample(gdemo([1.5, 2]), HMC(0.01, 10), 1000)
#
Turing.Inference.HMCDA — Type
HMCDA(n_adapts::Int, δ::Float64, λ::Float64; ϵ::Float64=0.0)
Сэмплер гамильтониана Монте-Карло с алгоритмом двойного среднего.
Использование:
HMCDA(200, 0.65, 0.3)
Аргументы:
-
n_adapts::Int: количество выборок, используемых для адаптации. -
δ::Float64: целевой коэффициент принятия. Часто рекомендуется 65 %. -
λ::Float64: целевая длина перешагивания. -
ϵ::Float64=0.0: начальный размер шага; 0 означает автоматический поиск с использованием Turing.
Дополнительные сведения см. в следующем документе (ссылка на arXiv):
-
Hoffman, Matthew D., and Andrew Gelman. The No-U-turn sampler: adaptively setting path lengths in Hamiltonian Monte Carlo. Journal of Machine Learning Research 15, no. 1 (2014): 1593-1623.
#
Turing.Inference.IS — Type
IS()
Алгоритм выборки по значимости.
Использование:
IS()
Пример:
# Определим простую нормальную модель с неизвестными средним и дисперсией.
@model function gdemo(x)
s² ~ InverseGamma(2,3)
m ~ Normal(0,sqrt.(s))
x[1] ~ Normal(m, sqrt.(s))
x[2] ~ Normal(m, sqrt.(s))
return s², m
end
sample(gdemo([1.5, 2]), IS(), 1000)
#
Turing.Inference.MH — Type
MH(space...)
Строит алгоритм Метрополиса-Гастингса.
Аргументами space могут быть
-
пустое значение (т. е.
MH()); в этом случаеMHпо умолчанию использует априорное распределение для каждого параметра в качестве распределения предложения; -
набор из одного или нескольких символов для выборки с помощью
MHв сочетании сGibbs, т. е.Gibbs(MH(:m), PG(10, :s)); -
итерируемый объект пар или кортежей, сопоставляющих
SymbolсAdvancedMH.Proposal,Distribution, или функция (Function), которая возвращает условное распределение предложения; -
ковариационная матрица, которую следует использовать для многомерных нормальных предложений с нулевым средним.
Примеры
MH по умолчанию будет использовать предлагаемые образцы из априорного распределения с помощью AdvancedMH.StaticProposal.
@model function gdemo(x, y)
s² ~ InverseGamma(2,3)
m ~ Normal(0, sqrt(s²))
x ~ Normal(m, sqrt(s²))
y ~ Normal(m, sqrt(s²))
end
chain = sample(gdemo(1.5, 2.0), MH(), 1_000)
mean(chain)
Кроме того, вы можете указать конкретные параметры для выборки, если хотите объединить выборку из нескольких сэмплеров:
@model function gdemo(x, y)
s² ~ InverseGamma(2,3)
m ~ Normal(0, sqrt(s²))
x ~ Normal(m, sqrt(s²))
y ~ Normal(m, sqrt(s²))
end
# Выбирает s с помощью MH и m с помощью PG
chain = sample(gdemo(1.5, 2.0), Gibbs(MH(:s), PG(10, :m)), 1_000)
mean(chain)
Применение пользовательских дистрибутивов по умолчанию приводит к использованию статического MH:
@model function gdemo(x, y)
s² ~ InverseGamma(2,3)
m ~ Normal(0, sqrt(s²))
x ~ Normal(m, sqrt(s²))
y ~ Normal(m, sqrt(s²))
end
# Используем статическое предложение для s и случайное блуждание со стандартным
# отклонением предложения в 0,25 для m.
chain = sample(
gdemo(1.5, 2.0),
MH(
:s => InverseGamma(2, 3),
:m => Normal(0, 1)
),
1_000
)
mean(chain)
Задание явных предложений с помощью интерфейса AdvancedMH:
@model function gdemo(x, y)
s² ~ InverseGamma(2,3)
m ~ Normal(0, sqrt(s²))
x ~ Normal(m, sqrt(s²))
y ~ Normal(m, sqrt(s²))
end
# Используем статическое предложение для s и случайное блуждание со стандартным
# отклонением предложения в 0,25 для m.
chain = sample(
gdemo(1.5, 2.0),
MH(
:s => AdvancedMH.StaticProposal(InverseGamma(2,3)),
:m => AdvancedMH.RandomWalkProposal(Normal(0, 0.25))
),
1_000
)
mean(chain)
Использование пользовательской функции для задания условного распределения:
@model function gdemo(x, y)
s² ~ InverseGamma(2,3)
m ~ Normal(0, sqrt(s²))
x ~ Normal(m, sqrt(s²))
y ~ Normal(m, sqrt(s²))
end
# Используем статическое предложение для s и условное предложение для m,
# где предложение сосредоточено вокруг текущего образца.
chain = sample(
gdemo(1.5, 2.0),
MH(
:s => InverseGamma(2, 3),
:m => x -> Normal(x, 1)
),
1_000
)
mean(chain)
Предоставление ковариационной матрицы заставит MH выполнить выборку случайных блужданий в преобразованном пространстве с предложениями, взятыми из многомерного нормального распределения. Предоставленная матрица должна быть положительной полуопределенной и квадратной. Использование:
@model function gdemo(x, y)
s² ~ InverseGamma(2,3)
m ~ Normal(0, sqrt(s²))
x ~ Normal(m, sqrt(s²))
y ~ Normal(m, sqrt(s²))
end
# Предоставление пользовательской дисперсионно-ковариационной матрицы
chain = sample(
gdemo(1.5, 2.0),
MH(
[0.25 0.05;
0.05 0.50]
),
1_000
)
mean(chain)
#
Turing.Inference.NUTS — Type
NUTS(n_adapts::Int, δ::Float64; max_depth::Int=10, Δ_max::Float64=1000.0, init_ϵ::Float64=0.0)
Сэмплер без разворота (NUTS).
Использование:
NUTS() # Используем конфигурацию NUTS по умолчанию.
NUTS(1000, 0.65) # Используем 1000 шагов адаптации и целевой коэффициент принятия, равный 0,65.
Аргументы:
-
n_adapts::Int: количество выборок, используемых при адаптации. -
δ::Float64: целевой коэффициент принятия для двойного среднего. -
max_depth::Int: максимальная глубина удвоенного дерева. -
Δ_max::Float64: максимальная дивергенция при удвоении дерева. -
init_ϵ::Float64: начальный размер шага; 0 означает автоматический поиск с использованием эвристической процедуры.
#
Turing.Inference.PG — Type
struct PG{space, R} <: Turing.Inference.ParticleInference
Сэмплер Гиббса на основе частиц.
Поля
-
nparticles::Int64: количество частиц. -
resampler::Any: алгоритм повторной выборки.
#
Turing.Inference.SMC — Type
struct SMC{space, R} <: Turing.Inference.ParticleInference
Последовательный сэмплер Монте-Карло.
Поля
-
resampler::Any
Распределения
#
Turing.Flat — Type
Flat()
Плоское распределение — это неправильное распределение вещественных чисел, которое имеет неправильную функцию плотности вероятности
#
Turing.FlatPos — Type
FlatPos(l::Real)
Положительное плоское распределение с вещественным параметром l — это неправильное распределение вещественных чисел, которое имеет неправильную функцию плотности вероятности
#
Turing.BinomialLogit — Type
BinomialLogit(n, logitp)
Биномиальное распределение с логит-параметризацией характеризует количество успешных выполнений в последовательности независимых попыток.
Оно имеет два параметра: n — количество попыток и logitp — логит вероятности вероятности успеха в отдельной попытке с распределением
См. также описание Binomial.
#
Turing.OrderedLogistic — Type
OrderedLogistic(η, c::AbstractVector)
Упорядоченное логистическое распределение с вещественным параметром η и точками сочленения c имеет вероятностную функцию массы
где K = length(c) + 1.