Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
probml
GitHub Repository: probml/pyprobml
Path: blob/master/deprecated/scripts/bayes_unigauss_2d_pymc3.py
1192 views
1
# Approximate 2d posterior using PyMc3
2
# https://www.ritchievink.com/blog/2019/06/10/bayesian-inference-how-we-are-able-to-chase-the-posterior/
3
# We use the same data and model as in posteriorGrid2d.py
4
5
import superimport
6
7
import numpy as np
8
import matplotlib.pyplot as plt
9
from scipy import stats
10
import pymc3 as pm
11
import pyprobml_utils as pml
12
import os
13
14
data = np.array([195, 182])
15
16
# lets create a grid of our two parameters
17
mu = np.linspace(150, 250)
18
sigma = np.linspace(0, 15)[::-1]
19
mm, ss = np.meshgrid(mu, sigma) # just broadcasted parameters
20
likelihood = stats.norm(mm, ss).pdf(data[0]) * stats.norm(mm, ss).pdf(data[1])
21
aspect = mm.max() / ss.max() / 3
22
extent = [mm.min(), mm.max(), ss.min(), ss.max()]
23
# extent = left right bottom top
24
25
prior = stats.norm(200, 15).pdf(mm) * stats.cauchy(0, 10).pdf(ss)
26
# Posterior - grid
27
unnormalized_posterior = prior * likelihood
28
posterior = unnormalized_posterior / np.nan_to_num(unnormalized_posterior).sum()
29
30
plt.figure()
31
plt.imshow(posterior, cmap='Blues', aspect=aspect, extent=extent)
32
plt.xlabel(r'$\mu$')
33
plt.ylabel(r'$\sigma$')
34
plt.title('Grid approximation')
35
pml.savefig('bayes_unigauss_2d_grid.pdf')
36
plt.show()
37
38
39
with pm.Model():
40
# priors
41
mu = pm.Normal('mu', mu=200, sd=15)
42
sigma = pm.HalfCauchy('sigma', 10)
43
# likelihood
44
observed = pm.Normal('observed', mu=mu, sd=sigma, observed=data)
45
# sample
46
trace = pm.sample(draws=10000, chains=2, cores=1)
47
48
pm.traceplot(trace);
49
50
plt.figure()
51
plt.scatter(trace['mu'], trace['sigma'], alpha=0.01)
52
plt.xlim([extent[0], extent[1]])
53
plt.ylim([extent[2], extent[3]])
54
plt.ylabel('$\sigma$')
55
plt.xlabel('$\mu$')
56
plt.title('MCMC samples')
57
pml.savefig('bayes_unigauss_2d_pymc3_post.pdf')
58
plt.show()
59
60