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