PyMC3大型MvNormal之前

时间:2017-07-25 08:35:44

标签: python bayesian pymc3

我想在PyMC3中指定大的多元正态分布作为先验。该分布的精度矩阵具有在数值上等于零的行列式。这似乎是PyMC3的一个问题。有什么建议?我只需要最大化后验,无论行列式的值如何都可以完成。

1 个答案:

答案 0 :(得分:2)

pymc3通过计算cholesky分解得到决定因素。它也在对数级上执行此操作,因此这不应该下溢。然而,矩阵可能被病态调节并且胆甾醇分解失败。在这种情况下,您可以在矩阵中添加一个小对角线。

如果您确定要使用病态条件矩阵,则可以编写自己的pm.MvNormal版本,但不包括det。有点像这样:

class MvNormalNoDet(pm.Continuous):
    def __init__(self, mu, tau, *args, **kwargs):
        self._mu = tt.as_tensor_variable(mu)
        self._tau = tt.as_tensor_variable(tau)
        self.mean = self.median = self.mode = self._mu
        super().__init__(*args, **kwargs)

    def logp(self, value):
        diff = value - self._mu
        return -0.5 * (diff * tt.dot(self._tau, diff)).sum(axis=-1)