Pymc de Py: una introducción detallada a pymc, instalación y uso
Tabla de contenido
(1) Usar el esquema de Euler-Maruyama para inferir los parámetros de SDE
Introducción a pymc
PyMC (anteriormente PyMC3) es un paquete de Python centrado en algoritmos avanzados de Markov Chain Monte Carlo (MCMC) y de inferencia variacional (VI) para el modelado estadístico bayesiano. Su flexibilidad y escalabilidad lo hacen aplicable a una amplia variedad de problemas. PyMC es una poderosa herramienta de modelado bayesiano que proporciona un amplio conjunto de características y algoritmos para una variedad de tareas de inferencia y modelado estadístico. Incluye estudios de casos de modelos lineales (generalizados) y lineales jerárquicos, inferencia causal, diagnóstico y evaluación de modelos, procesos gaussianos, inferencia de modelo ODE, métodos de cadena de Markov Monte Carlo, modelos mixtos, análisis de supervivencia, series temporales, inferencia variacional. Sus características son las siguientes:
>> Sintaxis de especificación de modelo intuitiva, por ejemplo, x ~ N(0,1) se puede traducir como x = Normal('x',0,1)
>> Potente algoritmo de muestreo, como No U -Turn Sampler, puede manejar modelos complejos con miles de parámetros >> sin conocimientos especiales de ajuste de algoritmos.
>> Inferencia variacional: ADVI que proporciona una estimación posterior aproximada rápida, así como ADVI de lotes pequeños para grandes conjuntos de datos.
>> Depende de PyTensor para proporcionar:
>> Optimización computacional y compilación dinámica de C o JAX
>> Difusión de NumPy e indexación avanzada
>> Operadores de álgebra lineal
>> Escalabilidad simple
>> Soporte transparente para el llenado de valores perdidos
GitHub链接: GitHub - pymc-devs/pymc: Modelado bayesiano en Python
文档: Descripción general introductoria de PyMC — Documentación de desarrollo de PyMC
instalación de pymc
pip install pymc
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymc
Como usar pymc
Más ejemplos : Galería de ejemplos de PyMC — Galería de ejemplos de PyMC
1. Tareas secuenciales
(1) Usar el esquema de Euler-Maruyama para inferir los parámetros de SDE
%pylab inline
import arviz as az
import pymc as pm
import scipy
import theano.tensor as tt
from pymc.distributions.timeseries import EulerMaruyama
%config InlineBackend.figure_format = 'retina'
az.style.use("arviz-darkgrid")
# parameters
λ = -0.78
σ2 = 5e-3
N = 200
dt = 1e-1
# time series
x = 0.1
x_t = []
# simulate
for i in range(N):
x += dt * λ * x + sqrt(dt) * σ2 * randn()
x_t.append(x)
x_t = array(x_t)
# z_t noisy observation
z_t = x_t + randn(x_t.size) * 5e-3
figure(figsize=(10, 3))
subplot(121)
plot(x_t[:30], "k", label="$x(t)$", alpha=0.5), plot(z_t[:30], "r", label="$z(t)$", alpha=0.5)
title("Transient"), legend()
subplot(122)
plot(x_t[30:], "k", label="$x(t)$", alpha=0.5), plot(z_t[30:], "r", label="$z(t)$", alpha=0.5)
title("All time")
tight_layout()
def lin_sde(x, lam):
return lam * x, σ2
with pm.Model() as model:
# uniform prior, but we know it must be negative
lam = pm.Flat("lam")
# "hidden states" following a linear SDE distribution
# parametrized by time step (det. variable) and lam (random variable)
xh = EulerMaruyama("xh", dt, lin_sde, (lam,), shape=N, testval=x_t)
# predicted observation
zh = pm.Normal("zh", mu=xh, sigma=5e-3, observed=z_t)
with model:
trace = pm.sample(2000, tune=1000)
figure(figsize=(10, 3))
subplot(121)
plot(percentile(trace[xh], [2.5, 97.5], axis=0).T, "k", label=r"$\hat{x}_{95\%}(t)$")
plot(x_t, "r", label="$x(t)$")
legend()
subplot(122)
hist(trace[lam], 30, label=r"$\hat{\lambda}$", alpha=0.5)
axvline(λ, color="r", label=r"$\lambda$", alpha=0.5)
legend();
# generate trace from posterior
ppc_trace = pm.sample_posterior_predictive(trace, model=model)
# plot with data
figure(figsize=(10, 3))
plot(percentile(ppc_trace["zh"], [2.5, 97.5], axis=0).T, "k", label=r"$z_{95\% PP}(t)$")
plot(z_t, "r", label="$z(t)$")
legend()