The sherpa.optmethods module
Optimization classes.
The OptMethod
class provides an interface to a number of optimisers.
When creating an optimizer an optional name can be added; this name is
only used in string representations of the class:
>>> from sherpa.optmethods import NelderMead
>>> opt = NelderMead()
>>> print(opt)
name = simplex
ftol = 1.1920928955078125e-07
maxfev = None
initsimplex = 0
finalsimplex = 9
step = None
iquad = 1
verbose = 0
reflect = True
A model is fit by providing the fit
method a callback, the starting
point (parameter values), and parameter ranges. The callback should
match the StatFunc
type:
callback(pars)
and return the statistic value to minimise along with the per-bin statistic values (note that per-bin here refers to the independent axis of the data being fit, and not the number of parameters being fit).
Changed in version 4.18.0: The callback is no-longer sent extra information (that is, the statargs and statkwargs values) and is just sent an array of parameter values.
Notes
Each optimizer has certain classes of problem where it is more, or
less, successful. For instance, the NelderMead
class should
only be used with chi-square based statistics.
Examples
Using Sherpa classes for data, models, and statistics we can create a callback, in this case using a least-squared statistic to fit a constant model to a 1D dataset (we do not need to send any extra arguments to the callback other than the parameter values in this case):
>>> import numpy as np
>>> from sherpa.data import Data1D
>>> from sherpa.models.basic import Const1D
>>> from sherpa.stats import LeastSq
>>> x = np.asarray([1, 2, 5])
>>> y = np.asarray([3, 2, 7])
>>> d = Data1D('data', x, y)
>>> mdl = Const1D()
>>> stat = LeastSq()
>>> def cb(pars):
... mdl.thawedpars = pars
... return stat.calc_stat(d, mdl)
We can check the model before the optimisaton run:
>>> print(mdl)
const1d
Param Type Value Min Max Units
----- ---- ----- --- --- -----
const1d.c0 thawed 1 -3.40282e+38 3.40282e+38
The model can be fit using the fit
method:
>>> from sherpa.optmethods import NelderMead
>>> opt = NelderMead()
>>> res = opt.fit(cb, mdl.thawedpars, mdl.thawedparmins, mdl.thawedparmaxes)
The return from fit
is a tuple where the first element indicates
whether the fit was successful, then the best-fit parameters, the
best-fit statistic, a string message, along with a dictionary
depending on the optimiser:
>>> print(res)
(True, array([4.]), 14.0, 'Optimization terminated successfully', {'info': True, 'nfev': 98})
>>> print(f"Best-fit value: {res[1][0]}")
Best-fit value: 4.0
We can see that the model has been updated thanks to the use of
cb
, which sets the thawedpars
attribute of mdl
:
>>> print(mdl)
const1d
Param Type Value Min Max Units
----- ---- ----- --- --- -----
const1d.c0 thawed 4 -3.40282e+38 3.40282e+38
Classes
|
Base class for the optimisers. |
|
Levenberg-Marquardt optimization method. |
|
Nelder-Mead Simplex optimization method. |
|
Monte Carlo optimization method. |
|
Grid Search optimization method. |