Hello everyone,
I have been trying to incorporate a multinomial sampling within theano.scan. I have managed to get it work as the theano function, and I think it is possible to write it completely without implementing pymc3. However, I wonder if I can do as a part of pymc3. Then I will be able to sample parameters from different distributions in nicer way.
For example, I have the following program:
import theano
import theano.tensor as tt
K_sym = tt.iscalar("K_sym")
n_sym = tt.lmatrix("n_sym")
p_sym = tt.dscalar("p_sym")
results_step, updates_step = theano.scan(lambda i, n, p: 2*theano_rng.multinomial(n=n[i,:],pvals=[p,1-p])[:,0],
sequences=[tt.arange(K_sym)],
n_steps=K_sym,
outputs_info=None,
non_sequences=[n_sym,p_sym])
compute_step = theano.function(inputs=[K_sym,n_sym,p_sym], outputs=results_step, updates=updates_step)
res = compute_step(2,np.transpose([[100,50]]*100),.6)
res
and I would like to re-write it as something like
import pymc3 as pm
import theano
import theano.tensor as tt
with pm.Model() as model:
# some definition of n, p, and K
n = pm.RV(shape=2) #or tt.as_tensor_variable()
p = pm.RV()
K = 2
results_step, updates_step = theano.scan(lambda i, n, p: 2*theano_rng.multinomial(n=n[i,:],pvals=[p,1-p])[:,0],
sequences=[tt.arange(K)],
n_steps=K,
outputs_info=None,
non_sequences=[n,p])
compute_step = theano.function(inputs=[K,n,p], outputs=results_step, updates=updates_step)
pm.Deterministic('result',compute_step)
sampling = pm.sample_prior_predictive(100)
which is wrong, because theano.function
should not be a part of the model. But I need to have it since there is sampling from multinomial inside theano.scan
.
Maybe some of you have had something similar, and would not mind to give some hints or an advice. Thank you in advance!
I have seen Sample within theano.scan?, but that one looked a bit different to me.