Py の pymc: pymc、インストール、および使用方法の詳細な紹介
目次
(1) オイラー・丸山スキームを使用して SDE のパラメータを推定する
pymc の概要
PyMC (旧名 PyMC3) は、ベイジアン統計モデリングのための高度なマルコフ連鎖モンテカルロ(MCMC) および変分推論(VI) アルゴリズムに焦点を当てたPython パッケージです。その柔軟性と拡張性により、さまざまな問題に適用できます。PyMC は、さまざまな統計モデリングおよび推論タスクに豊富な機能とアルゴリズムのセットを提供する強力なベイジアン モデリング ツールです。(一般化された) 線形および階層線形モデル、因果推論、診断とモデル評価、ガウス過程、ODE モデル推論、マルコフ連鎖モンテカルロ法、混合モデル、生存分析、時系列、変分推論のケース スタディが含まれます。その特徴は次のとおりです。
>> 直感的なモデル仕様構文。たとえば、x ~ N(0,1) は x = Normal('x',0,1) と変換できます。
>> No U などの強力なサンプリング アルゴリズム-Turn Sampler は、フィッティング アルゴリズムの特別な知識がなくても、数千のパラメーターを持つ複雑なモデルを処理できます。
>> 変分推論: 高速な近似事後推定を提供する ADVI と、大規模なデータセットに対する小規模バッチ ADVI を提供します。
>> 計算の
最適化と動的な C または JAX コンパイル
>> NumPy ブロードキャストと高度なインデックス作成
>> 線形代数演算子
>> シンプルなスケーラビリティ
>> 欠損値充填の透過的なサポート
GitHub链接: GitHub - pymc-devs/pymc: Python でのベイジアン モデリング
pymcのインストール
pip install pymc
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymc
pymcの使い方
その他の例: PyMC サンプル ギャラリー — PyMC サンプル ギャラリー
1. 連続したタスク
(1)オイラー・丸山スキームを使用して 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()