Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NUTS / transform / Goodwin failing #1400

Open
ben18785 opened this issue Aug 26, 2021 · 0 comments
Open

NUTS / transform / Goodwin failing #1400

ben18785 opened this issue Aug 26, 2021 · 0 comments
Assignees
Labels

Comments

@ben18785
Copy link
Collaborator

ben18785 commented Aug 26, 2021

I often seem to be getting an error when trying to run NUTS on the Goodwin-Oscillator example. The below code reproduces this. The failure only occurs when I use transformations but this doesn't seem to affect other (non-gradient-based) samplers.

import pints
import pints.toy
import numpy as np

model = pints.toy.GoodwinOscillatorModel()

# Create data
real_parameters = model.suggested_parameters()
times = np.linspace(0, 200, 1000)
values = model.simulate(real_parameters, times)
noise1 = 0.0001
noise2 = 0.003
noise3 = 0.05
noisy_values = np.array(values, copy=True)
noisy_values[:, 0] += np.random.normal(0, noise1, len(times))
noisy_values[:, 1] += np.random.normal(0, noise2, len(times))
noisy_values[:, 2] += np.random.normal(0, noise3, len(times))

# Create an object with links to the model and time series
problem = pints.MultiOutputProblem(model, times, values)

# Create a log posterior
log_prior = pints.MultivariateGaussianLogPrior(real_parameters,
                       np.diag([0.1, 0.1, 0.1, 0.1, 0.1]))
log_likelihood = pints.GaussianKnownSigmaLogLikelihood(problem,
                       [noise1, noise2, noise3])
log_posterior = pints.LogPosterior(log_likelihood, log_prior)

# Starting point that often gives errors
xs = [np.array([1.99890288, 4.01490882, 0.07433401, 0.11583922, 0.09271098])]

# Fails only when I use a transformation
transform = pints.LogTransformation(n_parameters=len(xs[0]))
mcmc = pints.MCMCController(log_posterior, 1, xs,
                            method=pints.NoUTurnMCMC,
                            transformation=transform)
mcmc.run()

When I print the sampled values as sampling progresses, I see that they diverge leading to infs quite quickly. Here's an example set of the first two iterations before failure occurs:

[1.99890288 4.01490882 0.07433401 0.11583922 0.09271098]
[2.95701368e-131 8.84698508e+059 inf inf inf]

The failure ultimately happens when log_prior.evaluateS1(x) is done. But, to me, this doesn't seem like the problem itself necessarily, because the sampler has already gone infinite at that point.

This seems like a really hard one to figure out as could be any combination of issues with NUTS, transformations, Goodwin oscillator or the priors!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants