Note
Go to the end to download the full example code
Using a custom fitter or samplerΒΆ
How to use your own minimizer or MCMC sampler for fitting light curves.
SNCosmo has three functions for model parameter estimation based on
photometric data: sncosmo.fit_lc
, sncosmo.mcmc_lc
and
sncosmo.nest_lc
. These are wrappers around external minimizers or
samplers (respectively: iminuit, emcee and nestle). However, one may
wish to experiment with a custom fitting or sampling method.
Here, we give a minimal example of using the L-BFGS-B minimizer from scipy.
import numpy as np
from scipy.optimize import fmin_l_bfgs_b
import sncosmo
model = sncosmo.Model(source='salt2')
data = sncosmo.load_example_data()
# Define an objective function that we will pass to the minimizer.
# The function arguments must comply with the expectations of the specfic
# minimizer you are using.
def objective(parameters):
model.parameters[:] = parameters # set model parameters
# evaluate model fluxes at times/bandpasses of data
model_flux = model.bandflux(data['band'], data['time'],
zp=data['zp'], zpsys=data['zpsys'])
# calculate and return chi^2
return np.sum(((data['flux'] - model_flux) / data['fluxerr'])**2)
# starting parameter values in same order as `model.param_names`:
start_parameters = [0.4, 55098., 1e-5, 0., 0.] # z, t0, x0, x1, c
# parameter bounds in same order as `model.param_names`:
bounds = [(0.3, 0.7), (55080., 55120.), (None, None), (None, None),
(None, None)]
parameters, val, info = fmin_l_bfgs_b(objective, start_parameters,
bounds=bounds, approx_grad=True)
print(parameters)
[ 5.03132682e-01 5.50980000e+04 1.19775598e-05 -2.59687230e-03
2.22018347e-01]
The built-in parameter estimation functions in sncosmo take care of setting up the likelihood function in the way that the underlying fitter or sampler expects. Additionally, they set guesses and bounds and package results up in a way that is as consistent as possible. For users wishing use a custom minimizer or sampler, it can be instructive to look at the source code for these functions.
Total running time of the script: ( 0 minutes 0.507 seconds)