PyAutoFit: Classy Probabilistic Programming
===========================================
.. |binder| image:: https://mybinder.org/badge_logo.svg
:target: https://mybinder.org/v2/gh/Jammy2211/autofit_workspace/HEAD
.. |RTD| image:: https://readthedocs.org/projects/pyautofit/badge/?version=latest
:target: https://pyautofit.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status
.. |Tests| image:: https://github.com/rhayes777/PyAutoFit/actions/workflows/main.yml/badge.svg
:target: https://github.com/rhayes777/PyAutoFit/actions
.. |Build| image:: https://github.com/rhayes777/PyAutoBuild/actions/workflows/release.yml/badge.svg
:target: https://github.com/rhayes777/PyAutoBuild/actions
.. |JOSS| image:: https://joss.theoj.org/papers/10.21105/joss.02550/status.svg
:target: https://doi.org/10.21105/joss.02550
|binder| |Tests| |Build| |RTD| |JOSS|
`Installation Guide <https://pyautofit.readthedocs.io/en/latest/installation/overview.html>`_ |
`readthedocs <https://pyautofit.readthedocs.io/en/latest/index.html>`_ |
`Introduction on Binder <https://mybinder.org/v2/gh/Jammy2211/autofit_workspace/release?filepath=notebooks/overview/overview_1_the_basics.ipynb>`_ |
`HowToFit <https://pyautofit.readthedocs.io/en/latest/howtofit/howtofit.html>`_
**PyAutoFit** is a Python based probabilistic programming language for model fitting and Bayesian inference
of large datasets.
The basic **PyAutoFit** API allows us a user to quickly compose a probabilistic model and fit it to data via a
log likelihood function, using a range of non-linear search algorithms (e.g. MCMC, nested sampling).
Users can then set up **PyAutoFit** scientific workflow, which enables streamlined modeling of small
datasets with tools to scale up to large datasets.
**PyAutoFit** supports advanced statistical methods, most
notably `a big data framework for Bayesian hierarchical analysis <https://pyautofit.readthedocs.io/en/latest/features/graphical.html>`_.
Getting Started
---------------
The following links are useful for new starters:
- `The PyAutoFit readthedocs <https://pyautofit.readthedocs.io/en/latest>`_, which includes an `installation guide <https://pyautofit.readthedocs.io/en/latest/installation/overview.html>`_ and an overview of **PyAutoFit**'s core features.
- `The introduction Jupyter Notebook on Binder <https://mybinder.org/v2/gh/Jammy2211/autofit_workspace/release?filepath=notebooks/overview/overview_1_the_basics.ipynb>`_, where you can try **PyAutoFit** in a web browser (without installation).
- `The autofit_workspace GitHub repository <https://github.com/Jammy2211/autofit_workspace>`_, which includes example scripts and the `HowToFit Jupyter notebook lectures <https://github.com/Jammy2211/autofit_workspace/tree/main/notebooks/howtofit>`_ which give new users a step-by-step introduction to **PyAutoFit**.
Support
-------
Support for installation issues, help with Fit modeling and using **PyAutoFit** is available by
`raising an issue on the GitHub issues page <https://github.com/rhayes777/PyAutoFit/issues>`_.
We also offer support on 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.
HowToFit
--------
For users less familiar with Bayesian inference and scientific analysis you may wish to read through
the **HowToFits** lectures. These teach you the basic principles of Bayesian inference, with the
content pitched at undergraduate level and above.
A complete overview of the lectures `is provided on the HowToFit readthedocs page <https://pyautofit.readthedocs.io/en/latest/howtofit/howtofit.htmll>`_
API Overview
------------
To illustrate the **PyAutoFit** API, we 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/main/files/toy_model_fit.png
:width: 400
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
normalization=0.1, # <- constructor arguments are
sigma=0.01, # <- the Gaussian's parameters.
):
self.centre = centre
self.normalization = normalization
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 model_data_from(self, xvalues):
transformed_xvalues = xvalues - self.centre
return (self.normalization / (self.sigma * (2.0 * np.pi) ** 0.5)) * \
np.exp(-0.5 * (transformed_xvalues / self.sigma) ** 2.0)
**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("normalization = ", instance.normalization)
print("Sigma = ", instance.sigma)
"""
We fit the ``data`` with the Gaussian instance, using its
"model_data_from" function to create the model data.
"""
xvalues = np.arange(self.data.shape[0])
model_data = instance.model_data_from(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 non-linear search:
.. code-block:: python
model = af.Model(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.
Raw data
{
"_id": null,
"home_page": "https://github.com/rhayes777/PyAutoFit",
"name": "autofit",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "cli",
"author": "James Nightingale and Richard Hayes",
"author_email": "richard@rghsoftware.co.uk",
"download_url": "https://files.pythonhosted.org/packages/99/f5/52bde1d129aa8bee82515742167d3fd2655d9b9bcffcb4ee0a8fbee07ffe/autofit-2024.11.13.2.tar.gz",
"platform": null,
"description": "PyAutoFit: Classy Probabilistic Programming\n===========================================\n\n.. |binder| image:: https://mybinder.org/badge_logo.svg\n :target: https://mybinder.org/v2/gh/Jammy2211/autofit_workspace/HEAD\n\n.. |RTD| image:: https://readthedocs.org/projects/pyautofit/badge/?version=latest\n :target: https://pyautofit.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. |Tests| image:: https://github.com/rhayes777/PyAutoFit/actions/workflows/main.yml/badge.svg\n :target: https://github.com/rhayes777/PyAutoFit/actions\n\n.. |Build| image:: https://github.com/rhayes777/PyAutoBuild/actions/workflows/release.yml/badge.svg\n :target: https://github.com/rhayes777/PyAutoBuild/actions\n\n.. |JOSS| image:: https://joss.theoj.org/papers/10.21105/joss.02550/status.svg\n :target: https://doi.org/10.21105/joss.02550\n\n|binder| |Tests| |Build| |RTD| |JOSS|\n\n`Installation Guide <https://pyautofit.readthedocs.io/en/latest/installation/overview.html>`_ |\n`readthedocs <https://pyautofit.readthedocs.io/en/latest/index.html>`_ |\n`Introduction on Binder <https://mybinder.org/v2/gh/Jammy2211/autofit_workspace/release?filepath=notebooks/overview/overview_1_the_basics.ipynb>`_ |\n`HowToFit <https://pyautofit.readthedocs.io/en/latest/howtofit/howtofit.html>`_\n\n**PyAutoFit** is a Python based probabilistic programming language for model fitting and Bayesian inference\nof large datasets.\n\nThe basic **PyAutoFit** API allows us a user to quickly compose a probabilistic model and fit it to data via a\nlog likelihood function, using a range of non-linear search algorithms (e.g. MCMC, nested sampling).\n\nUsers can then set up **PyAutoFit** scientific workflow, which enables streamlined modeling of small\ndatasets with tools to scale up to large datasets.\n\n**PyAutoFit** supports advanced statistical methods, most\nnotably `a big data framework for Bayesian hierarchical analysis <https://pyautofit.readthedocs.io/en/latest/features/graphical.html>`_.\n\nGetting Started\n---------------\n\nThe following links are useful for new starters:\n\n- `The PyAutoFit readthedocs <https://pyautofit.readthedocs.io/en/latest>`_, which includes an `installation guide <https://pyautofit.readthedocs.io/en/latest/installation/overview.html>`_ and an overview of **PyAutoFit**'s core features.\n\n- `The introduction Jupyter Notebook on Binder <https://mybinder.org/v2/gh/Jammy2211/autofit_workspace/release?filepath=notebooks/overview/overview_1_the_basics.ipynb>`_, where you can try **PyAutoFit** in a web browser (without installation).\n\n- `The autofit_workspace GitHub repository <https://github.com/Jammy2211/autofit_workspace>`_, which includes example scripts and the `HowToFit Jupyter notebook lectures <https://github.com/Jammy2211/autofit_workspace/tree/main/notebooks/howtofit>`_ which give new users a step-by-step introduction to **PyAutoFit**.\n\nSupport\n-------\n\nSupport for installation issues, help with Fit modeling and using **PyAutoFit** is available by\n`raising an issue on the GitHub issues page <https://github.com/rhayes777/PyAutoFit/issues>`_.\n\nWe also offer support on the **PyAutoFit** `Slack channel <https://pyautoFit.slack.com/>`_, where we also provide the\nlatest updates on **PyAutoFit**. Slack is invitation-only, so if you'd like to join send\nan `email <https://github.com/Jammy2211>`_ requesting an invite.\n\nHowToFit\n--------\n\nFor users less familiar with Bayesian inference and scientific analysis you may wish to read through\nthe **HowToFits** lectures. These teach you the basic principles of Bayesian inference, with the\ncontent pitched at undergraduate level and above.\n\nA complete overview of the lectures `is provided on the HowToFit readthedocs page <https://pyautofit.readthedocs.io/en/latest/howtofit/howtofit.htmll>`_\n\nAPI Overview\n------------\n\nTo illustrate the **PyAutoFit** API, we use an illustrative toy model of fitting a one-dimensional Gaussian to\nnoisy 1D data. Here's the ``data`` (black) and the model (red) we'll fit:\n\n.. image:: https://raw.githubusercontent.com/rhayes777/PyAutoFit/main/files/toy_model_fit.png\n :width: 400\n\nWe define our model, a 1D Gaussian by writing a Python class using the format below:\n\n.. code-block:: python\n\n class Gaussian:\n\n def __init__(\n self,\n centre=0.0, # <- PyAutoFit recognises these\n normalization=0.1, # <- constructor arguments are\n sigma=0.01, # <- the Gaussian's parameters.\n ):\n self.centre = centre\n self.normalization = normalization\n self.sigma = sigma\n\n \"\"\"\n An instance of the Gaussian class will be available during model fitting.\n\n This method will be used to fit the model to data and compute a likelihood.\n \"\"\"\n\n def model_data_from(self, xvalues):\n\n transformed_xvalues = xvalues - self.centre\n\n return (self.normalization / (self.sigma * (2.0 * np.pi) ** 0.5)) * \\\n np.exp(-0.5 * (transformed_xvalues / self.sigma) ** 2.0)\n\n**PyAutoFit** recognises that this Gaussian may be treated as a model component whose parameters can be fitted for via\na non-linear search like `emcee <https://github.com/dfm/emcee>`_.\n\nTo fit this Gaussian to the ``data`` we create an Analysis object, which gives **PyAutoFit** the ``data`` and a\n``log_likelihood_function`` describing how to fit the ``data`` with the model:\n\n.. code-block:: python\n\n class Analysis(af.Analysis):\n\n def __init__(self, data, noise_map):\n\n self.data = data\n self.noise_map = noise_map\n\n def log_likelihood_function(self, instance):\n\n \"\"\"\n The 'instance' that comes into this method is an instance of the Gaussian class\n above, with the parameters set to values chosen by the non-linear search.\n \"\"\"\n\n print(\"Gaussian Instance:\")\n print(\"Centre = \", instance.centre)\n print(\"normalization = \", instance.normalization)\n print(\"Sigma = \", instance.sigma)\n\n \"\"\"\n We fit the ``data`` with the Gaussian instance, using its\n \"model_data_from\" function to create the model data.\n \"\"\"\n\n xvalues = np.arange(self.data.shape[0])\n\n model_data = instance.model_data_from(xvalues=xvalues)\n residual_map = self.data - model_data\n chi_squared_map = (residual_map / self.noise_map) ** 2.0\n log_likelihood = -0.5 * sum(chi_squared_map)\n\n return log_likelihood\n\nWe can now fit our model to the ``data`` using a non-linear search:\n\n.. code-block:: python\n\n model = af.Model(Gaussian)\n\n analysis = Analysis(data=data, noise_map=noise_map)\n\n emcee = af.Emcee(nwalkers=50, nsteps=2000)\n\n result = emcee.fit(model=model, analysis=analysis)\n\nThe ``result`` contains information on the model-fit, for example the parameter samples, maximum log likelihood\nmodel and marginalized probability density functions.\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "Classy Probabilistic Programming",
"version": "2024.11.13.2",
"project_urls": {
"Homepage": "https://github.com/rhayes777/PyAutoFit"
},
"split_keywords": [
"cli"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "24ab7de7bf885b9ac78bc568acc4ba38c7ee33cae09bdf552636387870e7c24d",
"md5": "e1de98d22628c8723a311bac0d62dccc",
"sha256": "303abd6faa7b416e702d344892bd1afc8e1f7272a8ddcac120a9e1db91f3c563"
},
"downloads": -1,
"filename": "autofit-2024.11.13.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e1de98d22628c8723a311bac0d62dccc",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 389199,
"upload_time": "2024-11-13T13:50:36",
"upload_time_iso_8601": "2024-11-13T13:50:36.689603Z",
"url": "https://files.pythonhosted.org/packages/24/ab/7de7bf885b9ac78bc568acc4ba38c7ee33cae09bdf552636387870e7c24d/autofit-2024.11.13.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "99f552bde1d129aa8bee82515742167d3fd2655d9b9bcffcb4ee0a8fbee07ffe",
"md5": "b49269e6c6682c1ad19b83b60b535744",
"sha256": "1bb2b42d4136924a756a9f6d5f8c7463fad09dd60c429198efe51158b0359ea1"
},
"downloads": -1,
"filename": "autofit-2024.11.13.2.tar.gz",
"has_sig": false,
"md5_digest": "b49269e6c6682c1ad19b83b60b535744",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 277633,
"upload_time": "2024-11-13T13:50:38",
"upload_time_iso_8601": "2024-11-13T13:50:38.986674Z",
"url": "https://files.pythonhosted.org/packages/99/f5/52bde1d129aa8bee82515742167d3fd2655d9b9bcffcb4ee0a8fbee07ffe/autofit-2024.11.13.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-13 13:50:38",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "rhayes777",
"github_project": "PyAutoFit",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "anesthetic",
"specs": [
[
"==",
"2.8.14"
]
]
},
{
"name": "corner",
"specs": [
[
"==",
"2.2.2"
]
]
},
{
"name": "decorator",
"specs": [
[
">=",
"4.2.1"
]
]
},
{
"name": "dill",
"specs": [
[
">=",
"0.3.1.1"
]
]
},
{
"name": "dynesty",
"specs": [
[
"==",
"2.1.4"
]
]
},
{
"name": "typing-inspect",
"specs": [
[
">=",
"0.4.0"
]
]
},
{
"name": "emcee",
"specs": [
[
">=",
"3.1.6"
]
]
},
{
"name": "gprof2dot",
"specs": [
[
"==",
"2021.2.21"
]
]
},
{
"name": "matplotlib",
"specs": []
},
{
"name": "numpydoc",
"specs": [
[
">=",
"1.0.0"
]
]
},
{
"name": "pyprojroot",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "pyswarms",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "h5py",
"specs": [
[
">=",
"3.11.0"
]
]
},
{
"name": "SQLAlchemy",
"specs": [
[
"==",
"2.0.32"
]
]
},
{
"name": "scipy",
"specs": [
[
"<=",
"1.14.0"
]
]
},
{
"name": "astunparse",
"specs": [
[
"==",
"1.6.3"
]
]
},
{
"name": "threadpoolctl",
"specs": [
[
">=",
"3.1.0"
],
[
"<=",
"3.2.0"
]
]
},
{
"name": "timeout-decorator",
"specs": [
[
"==",
"0.5.0"
]
]
},
{
"name": "xxhash",
"specs": [
[
"<=",
"3.4.1"
]
]
},
{
"name": "networkx",
"specs": [
[
"==",
"3.1"
]
]
},
{
"name": "pyvis",
"specs": [
[
"==",
"0.3.2"
]
]
},
{
"name": "psutil",
"specs": [
[
"==",
"6.1.0"
]
]
}
],
"lcname": "autofit"
}