MCMC сохраняет образцы промежуточных значений с апостериорным?

Я использую Pyro для вывода параметров некоторого сложного расчета MCMC. Есть ли способ сохранить значения вычислений, выполненных с предполагаемыми переменными?

Краткая версия кода:

      def model(X_data, Y_data):
    #X_data, and Y_data are column vectors
    A = pyro.sample('A', dist.Normal(loc = 100.0, scale = 10.0)).double()
    B = pyro.sample('B', dist.Normal(loc = 25.0, scale = 2.0)).double()
    C = pyro.sample('C', dist.Normal(loc = 10.0, scale = 1.0)).double()
    D = pyro.sample('D', dist.Normal(loc = 400.0, scale = 50.0)).double()
    
    #Calculate Z for every value of X_data, return as column vector
    Z = some_complicated_calulation(A, B, C, D, X_data)

    #Create a distribution around Z
    Y_predicted = dist.Normal(loc = Z, scale = 10.0)

    #Sample from that distribution, and compare to observed data in Y_data
    pyro.sample('obs', Y_predicted, obs = Y_data)

kernel = NUTS(model, max_tree_depth=3, adapt_step_size=True)
posterior = MCMC(kernel, num_samples=200, warmup_steps=20)
posterior.run(X_grid, Y_grid)

Где X_data а также Y_data - это обучающий набор данных, и оба вектора-столбца тензоров факела (т.е. что-то с формой вроде (8,1)).

Когда я запускаю это и звоню posterior.get_samples()он возвращает заднюю часть A, B, C и D, каждая из которых имеет форму (200). Но мне также нужна задняя часть Z, которая должна иметь форму (8 200).

Сэмплер NUTS делает намного больше, чем 200 (или 220) вычислений Z в фоновом режиме, поэтому использование внешнего списка, тензора или словаря, похоже, не работает. Я думаю, что это можно сделать с pyro.param, но мне непонятно, как это сделать.

Моя конечная цель - получить доверительный интервал some_complicated_calculation для тестового набора неизмеренных значений X.

0 ответов

Другие вопросы по тегам