Общие модели смесей в pymc

У меня есть дистрибутив с несколькими горбами. Я хотел бы попробовать подобрать несколько различных типов распределений для каждого горба, гауссовского, экспоненциального, распределения Вейбуйля и т. д. Однако в нынешнем виде кажется, что мне нужно вручную определить стохастический класс для каждой комбинации. То, что я хотел бы сделать, это что-то вроде

@stochastic(model_a, model_b, observed=True)
def mixture(value=observed_time_series, model_a_parameters, model_b_parameters, p):
     def logp(value, model_a_parameters, model_b_parameters):
         return p*model_a.logp(value, *model_a_parameters) + (1-p)*model_b.logp(value, *model_b_parameters)
     def random(model_a_parameters, model_b_paramters, ratio):
        if(random() < ratio):
             return model_a.random()
        return model_b.random()

Возможно ли такое делегирование? Есть ли стандартный способ сделать это? Главное, что остановило бы что-то вроде вышеизложенного, это то, что я не могу придумать никакого способа сгруппировать наборы переменных вместе.


person archgoon    schedule 22.12.2013    source источник


Ответы (1)


Ты на правильном пути. Ваш декоратор stochastic можно упростить до:

@observed
def mixture(...):
    ...

Кроме того, вам нужно определить random только в том случае, если вам нужно сделать выборку из вероятности.

Другой подход к моделированию смесей заключается в использовании модели скрытых переменных, в которой отдельные наблюдения имеют индикаторы, соответствующие распределению, из которого они получены. Эти индикаторы могут быть смоделированы, например, с помощью Категориального распределения. Тогда это может иметь приор Дирихле и т. д.

person Chris Fonnesbeck    schedule 29.12.2013