Skip to main content

Classy non-linear optimisation

Project description

PyAutoFit

PyAutoFit is a Python-based probablistic programming language that allows complex model fitting techniques to be straightforwardly integrated into scientific modeling software. PyAutoFit specializes in:

  • Black box models with complex and expensive log likelihood functions.
  • Fitting many different model parametrizations to a data-set.
  • Modeling extremely large-datasets with a homogenous fitting procedure.
  • Automating complex model-fitting tasks via transdimensional model-fitting pipelines.

API Overview

To illustrate the PyAutoFit API, we'll use an illustrative toy model of fitting a one-dimensional Gaussian to noisy 1D data of a Gaussian's line profile. Here's an example of the data (blue) and the model we'll fit (orange):

.. image:: https://raw.githubusercontent.com/rhayes777/PyAutoFit/master/toy_model_fit.png :width: 400 :alt: Alternative text

We define our model, a 1D Gaussian, by writing a Python class using the format below.

.. code-block:: python

class Gaussian:

    def __init__(
        self,            # <- PyAutoFit recognises these
        centre = 0.0,    # <- constructor arguments are
        intensity = 0.1, # <- the model parameters of .
        sigma = 0.01,    # <- the Gaussian.
    ):
        self.centre = centre
        self.intensity = intensity
        self.sigma = sigma

"""
An instance of the Gaussian class will be available during model fitting.
This method will be used to fit the model to data and compute a likelihood.
"""

def line_from_xvalues(self, xvalues):

    transformed_xvalues = xvalues - self.centre

    return (self.intensity / (self.sigma * (2.0 * np.pi) ** 0.5)) * \
            np.exp(-0.5 * transformed_xvalues / self.sigma)

PyAutoFit recognises that this Gaussian may be treated as a model component whose parameters can be fitted for via a non-linear search like emcee <https://github.com/dfm/emcee>_..

To fit this Gaussian to the data we create an Analysis object, which gives PyAutoFit the data and a likelihood function describing how to fit the data with the model:

.. code-block:: python

class Analysis(af.Analysis):

    def __init__(self, data, noise_map):

        self.data = data
        self.noise_map = noise_map

    def log_likelihood_function(self, instance):

        """
        The 'instance' that comes into this method is an instance of the Gaussian class
        above, with the parameters set to (random) values chosen by the non-linear search.
        """

        print("Gaussian Instance:")
        print("Centre = ", instance.centre)
        print("Intensity = ", instance.intensity)
        print("Sigma = ", instance.sigma)

        """
        We fit the data with the Gaussian instance, using its
        "line_from_xvalues" function to create the model data.
        """

        xvalues = np.arange(self.data.shape[0])

        model_data = instance.line_from_xvalues(xvalues=xvalues)
        residual_map = self.data - model_data
        chi_squared_map = (residual_map / self.noise_map) ** 2.0
        log_likelihood = -0.5 * sum(chi_squared_map)

        return log_likelihood

We can now fit data to the model using a non-linear search of our choice.

.. code-block:: python

model = af.PriorModel(Gaussian)

analysis = a.Analysis(data=data, noise_map=noise_map)

emcee = af.Emcee(nwalkers=50, nsteps=2000)

result = emcee.fit(model=model, analysis=analysis)

The result object contains information on the model-fit, for example the parameter samples, best-fit model and marginalized probability density functions.

Getting Started

To get started checkout our readthedocs <https://pyautofit.readthedocs.io/>_, where you'll find our installation guide, a complete overview of PyAutoFit's features, examples scripts and tutorials and detailed API documentation.

Slack

We're building a PyAutoFit community on Slack, so you should contact us on our Slack channel <https://pyautofit.slack.com/>_ before getting started. Here, I give the latest updates on the software & can discuss how best to use PyAutoFit for your science case.

Unfortunately, Slack is invitation-only, so first send me an email <https://github.com/Jammy2211>_ requesting an invite.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

autofit-0.61.3.tar.gz (100.8 kB view details)

Uploaded Source

Built Distribution

autofit-0.61.3-py3-none-any.whl (136.5 kB view details)

Uploaded Python 3

File details

Details for the file autofit-0.61.3.tar.gz.

File metadata

  • Download URL: autofit-0.61.3.tar.gz
  • Upload date:
  • Size: 100.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.9

File hashes

Hashes for autofit-0.61.3.tar.gz
Algorithm Hash digest
SHA256 0eaf1f28656d44934619d5b525ee18460305ea3dcb198fb3651d26fceb055e3b
MD5 cf88d0dc9d586c72b4e8d0a1e1795a1b
BLAKE2b-256 38c419bd6c1b9bf16c43b085892adfffbbb6103e9fd8ad12b4b4e35afbd914a8

See more details on using hashes here.

File details

Details for the file autofit-0.61.3-py3-none-any.whl.

File metadata

  • Download URL: autofit-0.61.3-py3-none-any.whl
  • Upload date:
  • Size: 136.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.9

File hashes

Hashes for autofit-0.61.3-py3-none-any.whl
Algorithm Hash digest
SHA256 635eb9f8493b3cafe6548de548cafaefa2a3d27639b163161deb9cb9d66bccc5
MD5 3b7efe26b54f54529d0f62b05e1303c7
BLAKE2b-256 b06de62b2e3c772a65ef8aaa20f53a5526b66bf7cd8b86c08adc1ed35b7bd83f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page