Реализовать раннюю остановку в конферансье с учетом критерия сходимости - PullRequest
0 голосов
/ 11 мая 2018

Я использую emcee.EnsembleSampler для выборки некоторых вероятностей.Я делаю это на миллионах различных наборов данных, и поэтому важна производительность.

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

Я не могу найти какой-либо способ сделать это в документации или в своих поисках, поэтому надеялся, что у кого-то есть рецепт для этого.

1 Ответ

0 голосов
/ 11 мая 2018

Хотя я тоже не смог ничего найти в текущих документах emcee, в последних версиях, кажется, добавлен учебник, в котором показано, что именно вы пытаетесь сделать: ссылка

В случае разрыва ссылки или изменения ситуации вот пример:

import emcee
import numpy as np
np.random.seed(42)

# The definition of the log probability function
# We'll also use the "blobs" feature to track the "log prior" for each step
def log_prob(theta):
    log_prior = -0.5 *  np.sum((theta-1.0)**2 / 100.0)
    log_prob = -0.5 * np.sum(theta**2) + log_prior
    return log_prob, log_prior

# Initialize the walkers
coords = np.random.randn(32, 5)
nwalkers, ndim = coords.shape

# Set up the backend
# Don't forget to clear it in case the file already exists
filename = "tutorial.h5"
backend = emcee.backends.HDFBackend(filename)
backend.reset(nwalkers, ndim)

# Initialize the sampler
sampler = emcee.EnsembleSampler(nwalkers, ndim, log_prob, backend=backend)

max_n = 100000

# We'll track how the average autocorrelation time estimate changes
index = 0
autocorr = np.empty(max_n)

# This will be useful to testing convergence
old_tau = np.inf

# Now we'll sample for up to max_n steps
for sample in sampler.sample(coords, iterations=max_n, progress=True):
    # Only check convergence every 100 steps
    if sampler.iteration % 100:
        continue

    # Compute the autocorrelation time so far
    # Using tol=0 means that we'll always get an estimate even
    # if it isn't trustworthy
    tau = sampler.get_autocorr_time(tol=0)
    autocorr[index] = np.mean(tau)
    index += 1

    # Check convergence
    converged = np.all(tau * 100 < sampler.iteration)
    converged &= np.all(np.abs(old_tau - tau) / tau < 0.01)
    if converged:
        break
    old_tau = tau
...