pymc3.DensityDist中的shape变量无法正常工作

时间:2018-01-02 20:23:36

标签: python pymc3

我试图通过pymc3.DensityDist()定义多变量自定义分布;但是,我不断收到尺寸不匹配的错误:

“LinAlgError:给定的0维数组。数组必须是二维的”

我已经看过https://github.com/pymc-devs/pymc3/issues/535,但我无法找到问题的答案。为了清楚起见,这是我的简单示例

import numpy as np
import pymc3 as pm


def pdf(x):
    y = 0
    print(x)
    sigma = np.identity(2)
    isigma  = sigma
    mu = np.array([[1,2],[3,4]])
    for i in range(2):
        x0 = x- mu[i,:]
        xsinv = np.linalg.multi_dot([x0,isigma,x0])
        y = y + np.exp(-0.5*xsinv)
    return y


logp = lambda x: np.log(pdf(x))
with pm.Model() as model:
    pm.DensityDist('x',logp, shape=2)
    step = pm.Metropolis(tune=False, S=np.identity(2)) 
    trace = pm.sample(100000, step=step, chain=1, tune=0,progressbar=False)

result = trace['x']

在这个简单的代码中,我想定义一个未经规范化的pdf函数,它是两个非标准化正态分布的总和,并通过Metropolis算法从这个pdf中取样。

谢谢,

1 个答案:

答案 0 :(得分:2)

尝试在以下行中替换nanoy为theano:

xsinv = tt.dot(tt.dot(x0, isigma), x0)
y = y + tt.exp(-0.5 * xsinv)

作为附注,尝试使用NUTS而不是metropolis,让PyMC3为您选择采样方法,只需

trace = pm.sample(1000)

为了将来参考,您还可以提出问题here