Home#

PyMC is a probabilistic programming library for Python that allows users to build Bayesian models with a simple Python API and fit them using Markov chain Monte Carlo (MCMC) methods.

Features#

PyMC strives to make Bayesian modeling as simple and painless as possible, allowing users to focus on their problem rather than the methods.

Here is what sets it apart:

  • Modern: Includes state-of-the-art inference algorithms, including MCMC (NUTS) and variational inference (ADVI).

  • User friendly: Write your models using friendly Python syntax. Learn Bayesian modeling from the many example notebooks.

  • Fast: Uses PyTensor as its computational backend to compile through C, Numba or JAX, run your models on the GPU, and benefit from complex graph-optimizations.

  • Batteries included: Includes probability distributions, Gaussian processes, ABC, SMC and much more. It integrates nicely with ArviZ for visualizations and diagnostics, as well as Bambi for high-level mixed-effect models.

  • Community focused: Ask questions on discourse, join MeetUp events, follow us on Twitter, and start contributing.

Example from Linear Regression#

This example demonstrates how to perform Bayesian inference for a linear regression model to predict plant growth based on environmental factors.

Plant growth can be influenced by multiple factors, and understanding these relationships is crucial for optimizing agricultural practices.

Independent Variables:

  • Sunlight Hours: Number of hours the plant is exposed to sunlight daily.

  • Water Amount: Daily water amount given to the plant (in milliliters).

  • Soil Nitrogen Content: Percentage of nitrogen content in the soil.

Dependent Variable:

  • Plant Growth (y): Measured as the increase in plant height (in centimeters) over a certain period.

import pymc as pm

# Taking draws from a normal distribution
seed = 42
x_dist = pm.Normal.dist(shape=(100, 3))
x_data = pm.draw(x_dist, random_seed=seed)

# Define coordinate values for all dimensions of the data
coords={
 "trial": range(100),
 "features": ["sunlight hours", "water amount", "soil nitrogen"],
}

# Define generative model
with pm.Model(coords=coords) as generative_model:
   x = pm.Data("x", x_data, dims=["trial", "features"])

   # Model parameters
   betas = pm.Normal("betas", dims="features")
   sigma = pm.HalfNormal("sigma")

   # Linear model
   mu = x @ betas

   # Likelihood
   # Assuming we measure deviation of each plant from baseline
   plant_growth = pm.Normal("plant growth", mu, sigma, dims="trial")


# Generating data from model by fixing parameters
fixed_parameters = {
 "betas": [5, 20, 2],
 "sigma": 0.5,
}
with pm.do(generative_model, fixed_parameters) as synthetic_model:
   idata = pm.sample_prior_predictive(random_seed=seed) # Sample from prior predictive distribution.
   synthetic_y = idata.prior["plant growth"].sel(draw=0, chain=0)


# Infer parameters conditioned on observed data
with pm.observe(generative_model, {"plant growth": synthetic_y}) as inference_model:
   idata = pm.sample(random_seed=seed)

   summary = pm.stats.summary(idata, var_names=["betas", "sigma"])
   print(summary)

From the summary, we can see that the mean of the inferred parameters are very close to the fixed parameters

Params

mean

sd

hdi_3%

hdi_97%

mcse_mean

mcse_sd

ess_bulk

ess_tail

r_hat

betas[sunlight hours]

4.972

0.054

4.866

5.066

0.001

0.001

3003

1257

1

betas[water amount]

19.963

0.051

19.872

20.062

0.001

0.001

3112

1658

1

betas[soil nitrogen]

1.994

0.055

1.899

2.107

0.001

0.001

3221

1559

1

sigma

0.511

0.037

0.438

0.575

0.001

0

2945

1522

1

# Simulate new data conditioned on inferred parameters
new_x_data = pm.draw(
    pm.Normal.dist(shape=(3, 3)),
    random_seed=seed,
)
new_coords = coords | {"trial": [0, 1, 2]}

with inference_model:
    pm.set_data({"x": new_x_data}, coords=new_coords)
    pm.sample_posterior_predictive(
        idata,
        predictions=True,
        extend_inferencedata=True,
        random_seed=seed,
    )

pm.stats.summary(idata.predictions, kind="stats")

The new data conditioned on inferred parameters would look like:

Output

mean

sd

hdi_3%

hdi_97%

plant growth[0]

14.229

0.515

13.325

15.272

plant growth[1]

24.418

0.511

23.428

25.326

plant growth[2]

-6.747

0.511

-7.740

-5.797

# Simulate new data, under a scenario where the first beta is zero
with pm.do(
    inference_model,
    {inference_model["betas"]: inference_model["betas"] * [0, 1, 1]},
) as plant_growth_model:
    new_predictions = pm.sample_posterior_predictive(
        idata,
        predictions=True,
        random_seed=seed,
    )

pm.stats.summary(new_predictions, kind="stats")

The new data, under the above scenario would look like:

Output

mean

sd

hdi_3%

hdi_97%

plant growth[0]

12.149

0.515

11.193

13.135

plant growth[1]

29.809

0.508

28.832

30.717

plant growth[2]

-0.131

0.507

-1.121

0.791

Get started#

Announcements#

Release announcement

PyMC forked Aesara to PyTensor

PyTensor will allow for new features such as labeled arrays, as well as speed up development and streamline the PyMC codebase and user experience.

PyMC forked Aesara to PyTensor

Release announcement

PyMC 4.0 is officially released!

PyMC 4.0 is a major rewrite of the library with many great new features while keeping the same modeling API of PyMC3.

PyMC 4.0 Release Announcement

Event

PyMC - Office Hours

The PyMC team has recently started hosting office hours regularly. Subscribe on Discourse to be notified of the next event!

https://discourse.pymc.io/tag/office-hours

Talk

Probabilistic Programming in PyMC

Austin Rochford gave the coolest talk on Probabilistic Programming in PyMC 4.0

https://austinrochford.com/posts/intro-prob-prog-pymc.html

Blog post

Sprint testimonials

Read about the recent PyMC-Data Umbrella sprint in this interview with Sandra Meneses, one of the participants who submitted a PR

Participating in the PyMC-Data Umbrella sprint: Interview with Sandra Meneses

Sponsors#

NumFOCUS

NumFOCUS is our non-profit umbrella organization.

https://numfocus.org
PyMC Labs

PyMC Labs offers professional consulting services for PyMC.

https://pymc-labs.io
Mistplay

Mistplay is the world’s leading Loyalty Program for mobile gamers.

https://www.mistplay.com/
Adia Lab

Dedicated to basic and applied research in data and computational sciences.

https://www.adialab.ae/