Blackbox MCMC Testing

from blackbox import mystery
import numpy as np
import matplotlib.pyplot as plt

plt.style.use(['seaborn-v0_8-darkgrid', 'seaborn-v0_8-poster'])

Making sure initially that we can plot the mystery function:

xs = np.linspace(-30,30, 1000)
plt.plot(xs, mystery(xs), '.')
plt.show()

Setting up our sampler:

def mcmc_sampler(func, start, step_size, num_steps):
    samples = [start]
    accepted = 1
    while len(samples) < num_steps:
        current = samples[-1]
        proposed = np.random.normal(current, step_size)
        ratio = func(proposed) / func(current)
        if ratio > np.random.uniform(0,1):
            samples.append(proposed)
            accepted += 1
        else:
            samples.append(current)
    return samples, accepted / len(samples)

Running the sampler

samples, accept_rate = mcmc_sampler(mystery, -20, .5, 50000)
accept_rate
0.70642

Looking at the trace plot:

plt.figure(figsize=(16,9))
plt.plot(samples[:2000])
plt.xlabel('Iterations')
plt.ylabel('x')
plt.savefig('mcmc_trace.png', facecolor='#ffffff00')
plt.show()

Looking at the lag plot:

burned = samples[1000:]
plt.figure(figsize=(16,9))
plt.plot(burned[:-1], burned[1:], '.', alpha=0.1)
plt.xlabel(r"$x_{j}$")
plt.ylabel(r"$x_{j+1}$")
plt.savefig('mcmc_lag.png', facecolor='#ffffff00')
plt.show()

And looking at the overall histogram:

plt.hist(burned, bins=200)
plt.xlabel('x')
plt.ylabel('Counts')
plt.show()