Pymc de Py: una introducción detallada a pymc, instalación y uso

Pymc de Py: una introducción detallada a pymc, instalación y uso

Tabla de contenido

Introducción a pymc

instalación de pymc

Como usar pymc

1. Tareas secuenciales

(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()

Supongo que te gusta

Origin blog.csdn.net/qq_41185868/article/details/130715772
Recomendado
Clasificación