我试图通过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中取样。
谢谢,
答案 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