Справка по 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
.