Skip to main content

Classy Probabilistic Programming

Project description

PyAutoFit

PyAutoFit is a Python-based probabilistic programming language which:

  • Makes it straight forward to compose and fit models using a range of Bayesian inference libraries, such as emcee <https://github.com/dfm/emcee>_ and dynesty <https://github.com/joshspeagle/dynesty>_.
  • Handles the 'heavy lifting' of model fitting, including model composition and customization, outputting results in a structured path format and model-specific visualization.
  • Includes bespoke tools for big-data analysis, including massively parallel model fitting and database output structures so that large suites of results can be loaded into Jupyter notebooks post-analysis.

Advanced statistical methods in PyAutoFit include:

  • Graphical Models: Combine fits to many different datasets and determine the global parameters of a model, using an Expectation Propagation Bayesian framework <https://arxiv.org/abs/1412.4869v1>_.
  • Non-Linear Search Grid-Search: Simplify the fitting of highly complex parameters spaces by using a grid of non-linear searches, which can be performed simultaneously in an embarrassingly parallel fashion.
  • Transdimensional Pipelines: Chain together multiple fits of different models to streamline model comparison and automate complex model-fitting tasks.

Installation

PyAutoFit requires Python 3.6+ and you can install it via pip or conda (see this link <https://pyautofit.readthedocs.io/en/latest/general/installation.html#installation-with-conda>_ for conda instructions).

.. code-block:: bash

pip install autofit

Next, clone the autofit_workspace <https://github.com/Jammy2211/autofit_workspace>_, which includes PyAutoFit configuration files, example scripts and more!

.. code-block:: bash

cd /path/on/your/computer/you/want/to/put/the/autofit_workspace git clone https://github.com/Jammy2211/autofit_workspace --depth 1 cd autofit_workspace

Finally, run welcome.py in the autofit_workspace to get started!

.. code-block:: bash

python3 welcome.py

If your installation had an error, please check the troubleshooting section <https://pyautofit.readthedocs.io/en/latest/general/installation.html#trouble-shooting>_ on our readthedocs.

If you would prefer to Fork / Clone the PyAutoFit GitHub repo, please read the cloning section <https://pyautofit.readthedocs.io/en/latest/general/installation.html#forking-cloning>_ on our readthedocs first.

API Overview

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

.. 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,
        centre=0.0,     # <- PyAutoFit recognises these
        intensity=0.1,  # <- constructor arguments are
        sigma=0.01,     # <- the Gaussian's parameters.
    ):
        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 profile_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 log_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 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
        "profile_from_xvalues" function to create the model data.
        """

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

        model_data = instance.profile_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 our model to the data using a NonLinearSearch:

.. code-block:: python

model = af.PriorModel(Gaussian)

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

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

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

The result contains information on the model-fit, for example the parameter samples, maximum log likelihood 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, detailed API documentation and the HowToFit lecture series <https://pyautofit.readthedocs.io/en/latest/howtofit/howtofit.html> on how to integrate PyAutoFit into your modeling software.

Support

Support for installation issues and integrating your modeling software with PyAutoFit is available by raising an issue on the autofit_workspace GitHub page <https://github.com/Jammy2211/autofit_workspace/issues>. or joining the PyAutoFit Slack channel <https://pyautofit.slack.com/>, where we also provide the latest updates on PyAutoFit.

Slack is invitation-only, so if you'd like to join send 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.68.0.tar.gz (202.9 kB view details)

Uploaded Source

Built Distribution

autofit-0.68.0-py3-none-any.whl (300.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: autofit-0.68.0.tar.gz
  • Upload date:
  • Size: 202.9 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.68.0.tar.gz
Algorithm Hash digest
SHA256 bce3b7d2e43c14aada4e307a31850fea22ddeddcbe6b9215addbb43cbb8d6c4c
MD5 cb743d675158a95ef307962abe94ae56
BLAKE2b-256 c980da1516bc1900e5992817c3fb5b014ab1a938a34aebb321b527f7fde22cd6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: autofit-0.68.0-py3-none-any.whl
  • Upload date:
  • Size: 300.8 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.68.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3c86eed69d7e7304e785f0d4eeb21376024412c15acd6a62fe794eb91e6f3703
MD5 3c0e9f088adb130ea1b43cc3c796915e
BLAKE2b-256 e0b4a188e88dd6ab9858a727d3a0e303a2417f0f96445c152e78c156278f6d4d

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