def fit_beta_by_pt(nsteps): """Fit a beta distribution by parallel tempering.""" num_dimensions = 1 # Create the dummy model b = BetaFit(0.5, 0.5) # Create the options opts = MCMCOpts() opts.model = b opts.estimate_params = b.parameters opts.initial_values = [10 ** 0.5] opts.nsteps = nsteps opts.anneal_length = 0 opts.T_init = 1 opts.use_hessian = False opts.seed = 1 opts.norm_step_size = 0.5 opts.likelihood_fn = b.likelihood opts.step_fn = step # Create the MCMC object num_temps = 8 pt = PT_MCMC(opts, num_temps, 10) pt.estimate() plt.ion() for chain in pt.chains: fig = plt.figure() chain.prune(nsteps/10, 1) (heights, points, lines) = plt.hist(chain.positions, bins=100, normed=True) plt.plot(points, beta.pdf(points, b.a, b.b), 'r') plt.ylim((0,10)) plt.xlim((0, 1)) return pt
def fit_twod_gaussians_by_pt(nsteps): means_x = [ 0.1, 0.5, 0.9, 0.1, 0.5, 0.9, 0.1, 0.5, 0.9] means_y = [0.1, 0.1, 0.1, 0.5, 0.5, 0.5, 0.9, 0.9, 0.9] sd = 0.01 tdg = TwoDGaussianFit(means_x, means_y, sd ** 2) # Create the options opts = MCMCOpts() opts.model = tdg opts.estimate_params = tdg.parameters opts.initial_values = [1.001, 1.001] opts.nsteps = nsteps opts.anneal_length = 0 # necessary so cooling does not occur opts.T_init = 1 opts.use_hessian = False opts.seed = 1 opts.norm_step_size = 0.1 opts.likelihood_fn = tdg.likelihood opts.step_fn = step # Create the PT object num_temps = 8 pt = PT_MCMC(opts, num_temps, 100) pt.estimate() plt.ion() for chain in pt.chains: fig = plt.figure() chain.prune(nsteps/10, 1) plt.scatter(chain.positions[:,0], chain.positions[:,1]) ax = fig.gca() for x, y in zip(means_x, means_y): circ = plt.Circle((x, y), radius=2*sd, color='r', fill=False) ax.add_patch(circ) plt.xlim((-0.5, 1.5)) plt.ylim((-0.5, 1.5)) plt.title('Temp = %.2f' % chain.options.T_init) plt.show() return pt