Я хотел бы осуществить для реализации процесса Дирихле примера ссылки в Implementing Dirichlet processes for Bayesian semi-parametric models (Источника: here) в PyMC 3.процесс Дирихле в PyMC 3
В примере стержневой вероятность нарушения вычисляется с использованием pymc.deterministic
декоратор:
v = pymc.Beta('v', alpha=1, beta=alpha, size=N_dp)
@pymc.deterministic
def p(v=v):
""" Calculate Dirichlet probabilities """
# Probabilities from betas
value = [u*np.prod(1-v[:i]) for i,u in enumerate(v)]
# Enforce sum to unity constraint
value[-1] = 1-sum(value[:-1])
return value
z = pymc.Categorical('z', p, size=len(set(counties)))
Как бы реализовать это в PyMC 3, который использует Theano для вычисления градиента?
редактировать: Я попробовал следующее решение с помощью метода theano.scan
:
with pm.Model() as mod:
conc = Uniform('concentration', lower=0.5, upper=10)
v = Beta('v', alpha=1, beta=conc, shape=n_dp)
p, updates = theano.scan(fn=lambda stick, idx: stick * t.prod(1 - v[:idx]),
outputs_info=None,
sequences=[v, t.arange(n_dp)])
t.set_subtensor(p[-1], 1 - t.sum(p[:-1]))
category = Categorical('category', p, shape=n_algs)
sd = Uniform('precs', lower=0, upper=20, shape=n_dp)
means = Normal('means', mu=0, sd=100, shape=n_dp)
points = Normal('obs',
means[category],
sd=sd[category],
observed=data)
step1 = pm.Slice([conc, v, sd, means])
step3 = pm.ElemwiseCategoricalStep(var=category, values=range(n_dp))
trace = pm.sample(2000, step=[step1, step3], progressbar=True)
Который, к сожалению, очень медленно и не получить исходные параметры синтетических данных.
Есть ли лучшее решение, и это даже правильно?