我希望将大型多元正态分布指定为PyMC3中的优先项。这种分布的精度矩阵具有数值等于零的行列式。这似乎是PyMC3的一个问题。有什么建议吗?我只需要最大化后验,这是可以做的,无论行列式的值。
发布于 2017-07-28 21:12:02
pymc3通过计算cholesky分解得到行列式。它也是这样做的,在一个原木规模,所以这真的不应该低于流量。然而,矩阵可能是病态的,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)https://stackoverflow.com/questions/45298007
复制相似问题