I trying infer value of 𝛑 in simple toy example shown bellow.
But I am never get value similar to 3.1415
.
import warnings
import arviz as az
import matplotlib.pyplot as plt
import numpy as np
import pymc3 as pm
import scipy.stats as stats
az.style.use("arviz-darkgrid")
warnings.simplefilter(action="ignore", category=FutureWarning)
# Generate observations in range -1 ... 1
N = 5000
x = stats.uniform.rvs(size=N, loc=-1, scale=2)
y = stats.uniform.rvs(size=N, loc=-1, scale=2)
d = np.sqrt(x ** 2 + y ** 2)
# Mark values as 1 if point (x,y) fall inside unit circle
inside_observed = (d <= 1).astype(int)
with pm.Model() as model:
pi = pm.Uniform('pi', lower=2, upper=4)
# Bernoulli distribution take value 1 with probability pi/4
inside = pm.Bernoulli('inside', p=pi / 4, observed=inside_observed)
trace = pm.sample(10000, return_inferencedata=False)
az.plot_posterior(trace)
plt.show()
Here is example output of az.plot_posterior()
:
I tried increase number of sample but it is not helps.
What I should do to get answer correct at least 3th digit after point (e.g. 3.141).