I have a scenario where I have a 3D matrix comprising measurement data which varies with frequency (frequency being the 3rd dimension). Ultimately, I flatten this matrix into a vector to compare to my likelihood function.
My priors, which could be many, and easily more than 10 in number, influence the matrix.
I have checked the code by finding the maximum a posterior and the expected inference values (correct for my toy model) are returned. The NUTS sampling is very slow though and I wondered if the compact forming of the priors as shown below
with pm.Model() as model:
# Priors for unknown model parameters
k = pm.Uniform("k", 1000, 50000, shape=(10,))
k_vals = pm.Deterministic("k_vals", k)
would be slower than declaring them individually, eg
with pm.Model() as model:
# Priors for unknown model parameters
k1 = pm.Uniform("k1", 1000, 50000)
k2 = pm.Uniform("k2", 1000, 50000)
k3 = pm.Uniform("k3", 1000, 50000)
# etc.....
Is there a “correct” way more appropriate than others?
It shouldn’t make a difference for the sampler. Generally this form is easier to work with, it involves less manually relabeling things whenever you want to make a change to the model:
The batched version (shape=10) can be considerably faster as it produces vectorized logp and gradient code so it’s strongly suggested over separating the terms.
Noted on the use of size. Should this also be reflected in the number of chains i.e is it good practice to have a sufficient number of chains related to the number of k’s?
Those are unrelated. Each chain has to contain every k you are trying to estimate. So your modeling decisions and your sampler decisions are (generally) independent.