I’m trying to do Approximate Bayesian computing, and am able to use the pm.Simulator
class to estimate functions with 2 or more parameters. Here, each parameter is an array of multiple values.
However, when I try to estimate values of a function that accepts only a single parameter, I get an error. The simplest working example (loosely based on the actual code):
# 2 parameter pm.Simulator snippet
import pymc3 as pm
import numpy as np
def get_mean_sig2(mu,sigma):
multi_var = np.random.normal(mu,sigma)
return multi_var
# create the observed data
obs2 = get_mean_sig2(np.array([10,5,2,1]), np.array([0.5,1,2,1]))
with pm.Model() as m91:
mu = pm.Uniform('mu', lower=1, upper=15, shape=obs2.shape[0])
sigma = pm.Uniform('sigma',lower=0.25, upper=3,shape=obs2.shape[0])
sim = pm.Simulator('sim', get_mean_sig2 ,params=(mu,sigma), observed=obs2)
sample_91 = pm.sample_smc(kernel='ABC')
When I simplify the problem to only estimating the mean with this code:
# 1 parameter pm.Simulator snippet that gives error
def get_only_mean(mu):
multi_var = np.random.normal(mu,0.2)
return multi_var
obs = get_only_mean(np.array([10,5,2,1]))
with pm.Model() as m90:
mu = pm.Uniform('mu', lower=1, upper=15, shape=obs.shape[0])
sim = pm.Simulator('sim', get_only_mean,params=(mu),observed=obs)
sample_90 = pm.sample_smc(kernel='ABC')
I get the error message ValueError: Length of mu ~ Uniform cannot be determined
. I have tried variations of inputting shape=(1,obs.shape[0])
or manually setting shape=4
for the ‘shape’ parameter’s input - but failed.
I’m unable to understand why this problem suddenly appears - any help would be appreciated.
The same error appears on both Linux Mint 19.2 (python 3.8.5, pymc3 3.11, numpy 1.19.5, theano 1.1.0) and Windows 10 (python 3.8.5, pymc3 3.11.2, numpy 1.20.1, theano 1.1.2)