Построение многомерного нормального распределения с вероятностными параметрами в PyMC3

Я хочу построить многомерную нормальную модель в 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```

person joelnmdyer    schedule 02.06.2019    source источник


Ответы (1)


Я считаю, что вам не хватает аргумента «форма» в вызове pm.MvNormal, который позволяет ему обрабатывать значения правильного размера. Например, если у вас есть 7 переменных, установите shape=7.

person tooty44    schedule 22.10.2019
comment
Я думаю, что форма должна быть кортежем, но на самом деле это должно решить эту ошибку. - person pierresegonne; 25.04.2020
comment
@tooty, могу я попросить вас взглянуть на мой вопрос здесь? stackoverflow.com/questions/66237261 / - person Rylan Schaeffer; 17.02.2021