Процесс Дирихле в 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 для вычисления градиента?

edit: я попробовал следующее решение, используя метод 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)

Что, к сожалению, очень медленно и не получает исходных параметров синтетических данных.

Есть ли лучшее решение и правильно ли это?


person Kiudee    schedule 05.09.2014    source источник


Ответы (1)


Не уверен, что у меня есть хороший ответ, но, возможно, это можно было бы ускорить, используя вместо этого операцию черного ящика theano, которая позволяет вам писать распределение (или детерминированное) в коде Python. Например: https://github.com/pymc-devs/pymc3/blob/master/pymc3/examples/disaster_model_arbitrary_deterministic.py

person twiecki    schedule 15.09.2014
comment
Вот более прямой пример: docs.pymc.io/notebooks/dp_mix.html - person twiecki; 30.12.2019