def test_gibbs_chain_thin(): start_location = array([2.0, -4.0]) width_guesses = array([5.0, 0.05]) chain = GibbsChain(posterior=rosenbrock, start=start_location, widths=width_guesses) steps = 50 chain.advance(steps) with warnings.catch_warnings(): warnings.simplefilter("ignore") chain.autoselect_thin() assert 0 < chain.thin <= steps
# The plot_diagnostics() method can help us decide what size of burn-in to use: chain.plot_diagnostics() # Occasionally samples are also 'thinned' by a factor of n (where only every # n'th sample is used) in order to reduce the size of the data set for # storage, or to produce uncorrelated samples. # based on the diagnostics we can choose to manually set a global burn and # thin value, which is used (unless otherwise specified) by all methods which # access the samples chain.burn = 2000 chain.thin = 5 # the burn-in and thinning can also be set automatically as follows: chain.autoselect_burn() chain.autoselect_thin() # After discarding burn-in, what we have left should be a representative # sample drawn from the posterior. Repeating the previous plot as a # scatter-plot shows the sample: p = chain.get_probabilities() # color the points by their probability value plt.scatter(chain.get_parameter(0), chain.get_parameter(1), c = exp(p-max(p)), marker = '.') plt.xlabel('parameter 1') plt.ylabel('parameter 2') plt.grid() plt.show() # We can easily estimate 1D marginal distributions for any parameter # using the 'get_marginal' method: pdf_1 = chain.get_marginal(0, unimodal = True)