Я реализую сложный алгоритм выборки с использованием пакета MCM C TensorFlow Probability. Скажем, я использую выборку Гиббса для одного компонента, гамильтониан Монте-Карло для другого и, наконец, Random Walk Metropolis. Например, предположим, что у нас есть совместная вероятность:
p(X|a, b)p(b|c, d)p(c)p(d)p(a)
.
Моя пользовательская итерация выборки примерно равна:
def one_iteration():
# Sampling `a`:
# part of joint density: p(X|a, b)p(a)
# ...using some custom Gibbs sampler
# Sampling `b`:
# part of joint density: p(X|a, b)p(b|c, d)
def log_prob(b):
return p(X|a, b).log_prob() + p(b|c, d).log_prob(b)
hmc = tfp.mcmc.HamiltonianMonteCarlo(
log_prob, step_size=0.1, num_leapfrog_steps=3)
samples, is_accepted = tfp.mcmc.sample_chain(
num_results=1,
num_burnin_steps=0,
current_state=b,
kernel=hmc)
# Sampling `c`:
# part of joint density: p(b|c, d)p(c)
def log_prob(c):
return p(b|c, d).log_prob() + p(c).log_prob(c)
rwm = tfp.mcmc.RandomWalkMetropolis(log_prob)
samples, is_accepted = tfp.mcmc.sample_chain(
num_results=1,
num_burnin_steps=0,
current_state=c,
kernel=rwm)
А затем запустить это с помощью:
for i in range(T):
one_iteration()
Это правильный метод смешанной выборки? т.е. вызов sample_chain
каждой итерации для каждого алгоритма выборки компонентов?