我对PyMC很新,我正在尝试实现一个相当简单的贝叶斯相关模型,如"Bayesian Cognitive Modeling: A Practical Course"第5章所定义,其定义如下:
我已将我的代码放在ipython笔记本here中,代码段如下:
mu1 = Normal('mu1', 0, 0.001)
mu2 = Normal('mu2', 0, 0.001)
lambda1 = Gamma('lambda1', 0.001, 0.001)
lambda2 = Gamma('lambda2', 0.001, 0.001)
rho = Uniform('r', -1, 1)
@pymc.deterministic
def mean(mu1=mu1, mu2=mu2):
return np.array([mu1, mu2])
@pymc.deterministic
def precision(lambda1=lambda1, lambda2=lambda2, rho=rho):
sigma1 = 1 / sqrt(lambda1)
sigma2 = 1 / sqrt(lambda2)
ss1 = sigma1 * sigma2
ss2 = sigma2 * sigma2
rss = rho * sigma1 * sigma2
return np.power(np.mat([[ss1, rss], [rss, ss2]]), -1)
xy = MvNormal('xy', mu=mean, tau=precision, value=data, observed=True)
M = pymc.MCMC(locals())
M.sample(10000, 5000)
我得到的错误是“错误:将flib.prec_mvnorm的第三个参数`tau'转换为C / Fortran数组失败了”
我只找到了另一个对此错误的引用(在this question中),但我看不到如何将答案应用到我的代码中。
答案 0 :(得分:2)
这种无法提供信息的错误是由于您组织数据向量的方式。它是n
列的2行,PyMC
期望它是n
行2列。以下修改使得此代码(几乎)对我有用:
xy = MvNormal('xy', mu=mean, tau=precision, value=data.T, observed=True)
我说几乎是因为我也改变了你的精度矩阵,没有矩阵功率部分。我认为图中的MvNormal
有一个方差 - 协方差矩阵作为第二个参数,而MvNormal
中的PyMC
需要一个精度矩阵(等于C
的倒数)。
Here is a notebook which has no more errors,但现在有警告需要进一步调查。