2017-07-25 51 views
1

我想在PyMC3中指定較大的多元正態分佈。這種分佈的精度矩陣的行列式在數值上等於零。這似乎是PyMC3的一個問題。有什麼建議麼?我只需要最大化後驗,不管行列式的值如何,都可以完成。PyMC3 large MvNormal before

回答

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)