在PyMC3中使用概率参数构造多元正态分布

时间:2019-06-02 18:24:41

标签: theano pymc3

我想在PyMC3中构建多元正态模型,其中平均值和精度矩阵涉及概率变量。 h旨在在此代码段所属的较大项目中充当潜在变量。

运行下面提供的代码时,我收到显示的错误消息,并且不确定如何解释它。据我所知,MvNormal(2行列向量)的平均值的维与精度矩阵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```

1 个答案:

答案 0 :(得分:0)

我相信您在pm.MvNormal调用中缺少“ shape”参数,该参数使它可以处理正确的值大小。例如,如果您有7个变量,则设置shape = 7。