что такое итерация в pymc

У меня есть модель в pymc, упрощенная

import pymc as pm
a = pm.Normal('a', 0,5)
b = pm.Normal('b', 0,5)
cnt = 0

@pm.deterministic
def mu(a=a, b=b):
    global cnt
    cnt += 1
    return a + b*x # x and y were loaded from csv
y_hat = pm.Normal('y', mu, 1, observed=True, value=y)

mc = pm.MCMC([a,b,mu,y_hat])
mc.sample(100)
print (cnt)

результат:

240

После запуска модели я ожидаю, что cnt будет равно 100, но печать дает около 240 (не каждая выборка возвращает одно и то же, но примерно такое число). Я думал, что pymc, возможно, делал некоторую настройку в первые несколько, но даже при нескольких тысячах итераций cnt всегда примерно в 2 раза больше, чем итерации mcmc.

  • В чем причина этого?
  • Могу ли я контролировать это с помощью ручной настройки?

person DeanLa    schedule 29.10.2016    source источник


Ответы (1)


Количество вычислений mu не связано с количеством итераций в любом запуске MCMC. Я бы не ожидал, что они будут эквивалентны. Что вы пытаетесь сделать?

person Chris Fonnesbeck    schedule 29.11.2016
comment
Я пытаюсь подогнать динамическую модель, в которой mu на самом деле представляет собой набор разностных уравнений, выполнение которых занимает несколько секунд. Следовательно, выполнение нескольких тысяч итераций занимает день, и если mu оценивается больше, чем подогнанный параметр (`y), иногда это составляет 3 дня. - person DeanLa; 29.11.2016
comment
Я бы предложил профилировать данные, чтобы увидеть, что занимает так много времени. Это очень большой набор данных? MCMC плохо масштабируется для больших данных. Если это так, вы можете взглянуть на PyMC3, который включает подходы к выводу без выборки, а именно вариационный вывод. - person Chris Fonnesbeck; 29.11.2016
comment
Данных мало. Сама модель длинная. Один его запуск, выходящий за рамки pymc, является потребителем времени - это динамическая модель с примерно 200 отсеками примерно на 1000 временных меток. - person DeanLa; 29.11.2016
comment
Возможно, стоит проверить, можете ли вы пакетно обновить несколько ваших параметров. Параметры внутри одного и того же Container будут обновлены пакетно, что ускорит работу. Опять же, использование VI в PyMC3 также может помочь, но если вы уже закодировали большую модель, вы можете не захотеть ее портировать. - person Chris Fonnesbeck; 30.11.2016