Package: batty
BAT to Python (batty)A small python interface to the Bayesian Analysis Toolkit (BAT.jl)https://github.com/bat/BAT.jlPlease check out the minimal example to get startedbelowTo understand how to define a prior + likelihood, please readthisFor experimental support of gradients, seethisQuick StartInstallationThere are two parts to an installation, one concerning the python side, and one the julia side:Python:pip install battyJulia:import Pkg; Pkg.add.(["PyJulia", "DensityInterface", "Distributions", "ValueShapes", "TypedTables", "ArraysOfArrays", "ChainRulesCore", "BAT"])Minimal ExampleThe code below is showing a minimal example:using a gaussian likelihood and a uniform priorgenerating samples via Metropolis-Hastingsplotting the resulting sampesestimating the integral value via BridgeSampling%load_extautoreload%autoreload2importnumpyasnpimportmatplotlib.pyplotasplt%matplotlibinlinefrombattyimportBAT_sampler,BAT,Distributions,jlsampler=BAT_sampler(llh=lambdax:-0.5*x**2,prior_specs=Distributions.Uniform(-3,3))sampler.sample();sampler.corner();UsageUsing Different AlgotihmsThere are a range of algorihtms available within BAT, and those can be further customized via arguments. Here are just a few examples:MCMC Sampling:results={}Metropolis-Hastings:results['Metropolis-Hastings']=sampler.sample(strategy=BAT.MCMCSampling(nsteps=10_000,nchains=2))Metropolis-Hastings with Accept-Reject weighting:results['Accept-Reject Weighting']=sampler.sample(strategy=BAT.MCMCSampling(mcalg=BAT.MetropolisHastings(weighting=BAT.ARPWeighting()),nsteps=10_000,nchains=2))Prior Importance Sampling:results['Prior Importance Sampling']=sampler.sample(strategy=BAT.PriorImportanceSampler(nsamples=10_000))Sobol Sampler:results['Sobol Quasi Random Numbers']=sampler.sample(strategy=BAT.SobolSampler(nsamples=10_000))Grid Sampler:results['Grid Points']=sampler.sample(strategy=BAT.GridSampler(ppa=1000))Plotting the different results:fig=plt.figure(figsize=(9,6))bins=np.linspace(-3,3,100)forkey,iteminresults.items():plt.hist(item.v,weights=item.weight,bins=bins,density=True,histtype="step",label=key);plt.legend()<matplotlib.legend.Legend at 0x7f069fcd5ee0>Specifying Priors and LikelihoodsPriors are specified via JuliaDistributions, multiple Dimensions can be defined via adict, where thekeyis the dimension name and the value the distribution, or as a list in case flat vectors with paraeter names are used.Below the examplewithparameter namess=np.array([[0.25,0.4],[0.9,0.75]])prior_specs={'a':Distributions.Uniform(-3,3),'b':Distributions.MvNormal(np.array([1.,1.]),jl.Array(s@s.T))}The log-likelihood (llh) can be any python callable, that returns the log-likelihood values. The first argument to the function is the object with paramneter values, herex. If the prior is simple (i.e. like in the example in the beginning,xis directly the parameter value). If the prior is specified via adict, thenxcontains a field per parameter with the value.
Any additionalargsto the llh can be given in the sampler, such as heredfor data:defllh(x,d):return-0.5*((x.b[0]-d[0])**2+(x.b[1]-d[1])**2/4)-x.aOr alternativelywithoutparameter names (this will result in a flat vector):# prior_specs = [Distributions.Uniform(-3,3), Distributions.MvNormal(np.array([1.,1.]), jl.Array(s@s.T))]# def llh(x, d):#     return -0.5 * ((x[1] - d[0])**2 + (x[2] - d[1])**2/4) - x[0]d=[-1,1]sampler=BAT_sampler(llh=llh,prior_specs=prior_specs,llh_args=(d,))Let us generate a few samples:sampler.sample(strategy=BAT.MCMCSampling(nsteps=10_000,nchains=2));Some interface to plotting tools are availableTheGreatTriangularConfusion (GTC) plot:sampler.gtc(figureSize=8,customLabelFont={'size':14},customTickFont={'size':10});findfont: Font family ['Arial'] not found. Falling back to DejaVu Sans.
findfont: Font family ['Arial'] not found. Falling back to DejaVu Sans.The corner plot:sampler.corner(color='green');HMC with GradientsThis at the moment only works with preiors defined as flat vectors!llh=lambdax:-0.5*np.dot(x,x)grad=lambdax:-xsampler=BAT_sampler(llh=llh,prior_specs=[Distributions.Uniform(-3,3),],grad=grad,)# Or alternatively:# llh_and_grad = lambda x: (-0.5 * np.dot(x, x), -x)# sampler = BAT_sampler(llh=llh, prior_specs=[Distributions.Uniform(-3, 3),], llh_and_grad=llh_and_grad)sampler.sample(strategy=BAT.MCMCSampling(mcalg=BAT.HamiltonianMC()));sampler.corner();