Построение многомерного нормального распределения с вероятностными параметрами в PyMC3 - PullRequest
1 голос
/ 02 июня 2019

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

Когда я запускаю приведенный ниже код, я получаю сообщение об ошибке, и я не уверен, как именно его интерпретировать. Насколько я вижу, измерение среднего значения MvNormal (двухстрочный вектор столбца) соответствует измерению прецизионной матрицы B (матрица 2 x 2), поэтому я не ожидаю, что это размеры этих объектов, которые вызывают проблемы. Я не знаю, какие другие переменные могут вызывать ошибки, связанные с измерениями. Кто-нибудь может пролить свет на это, пожалуйста?

Вот код:

import pymc3 as pm
import theano.tensor as tt

with pm.Model() as model:

    # A matrix
    a1 = pm.Uniform('a1', 0., 1.)
    a2 = pm.Uniform('a2', 0., 1.)
    ix = ([0, 0, 1, 1], [0, 1, 0, 1])
    A = tt.eye(2)
    A = tt.set_subtensor(A[ix], [a1, a2, 1, 0])
    # B matrix
    b1 = pm.Uniform('b1', 0., 1.)
    b2 = pm.Uniform('b2', 0., 1.)
    ix = ([0, 1], [0, 1])
    B = tt.eye(2)
    B = tt.set_subtensor(B[ix], [b1 ** 2, b2 ** 2])
    # Model
    y0 = pm.Normal('y0', mu=0., sd=1., observed=0)
    y1 = pm.Normal('y1', mu=1., sd=1., observed=1)
    s_v = tt.stack([y1, y0]).T
    h = pm.MvNormal("h", mu=pm.math.dot(A, s_v), tau=B)

Сообщение об ошибке:

  h = pm.MvNormal("h", mu=pm.math.dot(A, s_v), tau=B)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/distributions/distribution.py", line 42, in __new__
  return model.Var(name, dist, data, total_size)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/model.py", line 809, in Var
  total_size=total_size, model=self)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/model.py", line 1209, in __init__
  self.logp_elemwiset = distribution.logp(self)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/distributions/multivariate.py", line 274, in logp
  quaddist, logdet, ok = self._quaddist(value)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/distributions/multivariate.py", line 85, in _quaddist
  raise ValueError('Invalid dimension for value: %s' % value.ndim)
ValueError: Invalid dimension for value: 0```
...