2016-11-29 4 views
3

Возможно ли инкрементное обновление модели в pyMC3. В настоящее время я не могу найти информацию об этом. Вся документация всегда работает с априорными известными данными.Обновление инкрементной модели pyMC3

Но, по моему мнению, байесовская модель также означает возможность обновить веру. Возможно ли это в pyMC3? Где я могу найти информацию в этом?

Спасибо :)

+0

AFAIK, это не реализовано в PyMC3. Тем не менее вы можете сделать это _manually_, просто используйте некоторые данные и ранее, используйте PyMC3 для обновления, чтобы вычислить задний, а затем использовать задний, как и раньше. Возможно, вы захотите задать этот вопрос [здесь] (https://gitter.im/pymc-devs/pymc) – aloctavodia

+0

Нет, главное ограничение состоит в том, что после каждого обновления вам нужно будет преобразовать ваши посты в призму, прежде чем включать следующей партии данных. –

+0

Чтобы уточнить: Я хочу построить модель, которая предсказывает, когда происходят определенные события. Всякий раз, когда происходит реальное событие, я хочу обновить свою веру. Могу ли я сделать это в pymc3? Насколько я понял, библиотека в основном поддерживает MCMC и поэтому не работает с простыми байесовскими обновлениями или не так ли? Я в основном пытался использовать библиотеку, потому что я могу создавать сложные модели, где, например, несколько моих событий имеют определенные знания. – Christian

ответ

3

После @ совета ChrisFonnesbeck, я написал небольшой учебник ноутбук о дополнительном предварительном обновлении. Его можно найти здесь:

https://github.com/pymc-devs/pymc3/blob/master/docs/source/notebooks/updating_priors.ipynb

В принципе, вам нужно обернуть ваши образцы жевательных в пользовательском непрерывном классе, который вычисляет KDE из них. Следующий код делает только что:

def from_posterior(param, samples): 

    class FromPosterior(Continuous): 

     def __init__(self, *args, **kwargs): 
      self.logp = logp 
      super(FromPosterior, self).__init__(*args, **kwargs) 

    smin, smax = np.min(samples), np.max(samples) 
    x = np.linspace(smin, smax, 100) 
    y = stats.gaussian_kde(samples)(x) 
    y0 = np.min(y)/10 # what was never sampled should have a small probability but not 0 

    @as_op(itypes=[tt.dscalar], otypes=[tt.dscalar]) 
    def logp(value): 
     # Interpolates from observed values 
     return np.array(np.log(np.interp(value, x, y, left=y0, right=y0))) 

    return FromPosterior(param, testval=np.median(samples)) 

Затем определить до вашего параметра модели (скажем alpha), вызвав from_posterior функцию с именем параметра и образцы следов от задней части предыдущей итерации:

alpha = from_posterior('alpha', trace['alpha'])