Как установить свойство «observed» для случайных величин PyMC3, полученных из ненаблюдаемых случайных величин

#python #probability #pymc3

#python #вероятность #pymc3

Вопрос:

Я работаю с PyMC3 и не уверен в том, как пометить определенные переменные как «наблюдаемые». В простом примере я мог бы иметь две входные переменные, смоделированные как равномерное распределение в [0, 1]. Я знаю, что третья случайная величина «output» равна произведению двух входных данных, и, допустим, я заметил, что первый входной сигнал равен 1, а выходной — 0. Затем я хочу использовать PyMC3 для прогнозирования второго ввода, который в этом случае должен быть равен 0.

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

 import pymc3 as pm

with pm.Model() as model:
  input1 = pm.Uniform('RV1', lower=0, upper=1, observed=1)  # API is clear how to mark it observed
  input2 = pm.Uniform('RV2', lower=0, upper=1)  # This one is not observed
  output = input1 * input2  # How to tell PyMC3 the observed value of "output"?
  # Now I will do variational inference, sampling, etc... on the model
  

Случайные величины технически являются логическими случайными величинами, но мне нужно моделировать их как непрерывные, чтобы делать вариационный вывод. И у меня их много, это минимальный пример. Настройка output.observed = 0 , похоже, не работает, хотя и не приводит к сбою.

Комментарии:

1. Вы когда-нибудь находили решение этой проблемы?

2. Это не решает всех проблем, но один ограниченный способ, которым я справился с этим, заключался в аналитическом вычислении свертки двух распределений. Это работает, когда я добавлял две случайные величины, но выполнение чего-либо сложного может быстро усложниться. Я тоже ищу ответ!

Ответ №1:

При выполнении детерминированной (т. Е. замкнутой формы) математической операции с переменными вы можете использовать pymc3.Deterministic('your_deterministic_var', input1 * input2) распределение вероятностей. Насколько я знаю, это не позволяет использовать observed ключевое слово, как вы просили, хотя после завершения выборки ( pm.sample() ) вы можете запустить pm.sample_posterior_predictive(chain, var_names=['your_deterministic_var']) и использовать средства записи переменных или все, что вам нужно.

Для получения дополнительной информации о детерминировании ознакомьтесь с документацией, а также с дискуссионным форумом PyMC3, который в любом случае является лучшим местом для вопросов PyMC3, чем stackoverflow.