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