使用PyMC的贝叶斯相关

时间:2014-12-16 10:34:55

标签: correlation bayesian pymc

我对PyMC很新,我正在尝试实现一个相当简单的贝叶斯相关模型,如"Bayesian Cognitive Modeling: A Practical Course"第5章所定义,其定义如下:

Graphical model

我已将我的代码放在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中),但我看不到如何将答案应用到我的代码中。

1 个答案:

答案 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,但现在有警告需要进一步调查。