Example #1
0
 def evidence(self, D):
     """Return Pr(D) = \int Pr(D | theta) Pr(theta)"""
     shape = D.shape
     if len(shape) == 2:
         n, d = shape
     elif len(shape) == 1:
         n, d = 1, shape[0]
     assert d == self.d
     # Eq (266)
     mu_n, kappa_n, Lam_n, nu_n = self._post_params(D)
     detLam0 = np.linalg.det(self.Lam_0)
     detLamn = np.linalg.det(Lam_n)
     num = gammad(d, nu_n/2.0) * detLam0**(self.nu_0/2.0)
     den = np.pi**(n*d/2.0) * gammad(d, self.nu_0/2.0) * detLamn**(nu_n/2.0)
     return num/den * (self.kappa_0/kappa_n)**(d/2.0)
Example #2
0
 def __call__(self, *args):
     """Returns Pr(mu, Sig), i.e., the prior."""
     if len(args) == 1:
         mu = args[0]['mu']
         Sig = args[0]['Sig']
     elif len(args) == 2:
         mu, Sig = args
     nu_0, d = self.nu_0, self.d
     # Eq (249)
     Z = (2.0**(nu_0*d/2.0) * gammad(d, nu_0/2.0) *
          (2.0*np.pi/self.kappa_0)**(d/2.0) / np.linalg.det(self.Lam_0)**(nu_0/2.0))
     detSig = np.linalg.det(Sig)
     invSig = np.linalg.inv(Sig)
     einsum = np.einsum("...i,...ij,...j", mu-self.mu_0, invSig, mu-self.mu_0)
     # Eq (248)
     return 1./Z * detSig**(-((nu_0+d)/2.0+1.0)) * np.exp(
         -0.5*np.trace(np.einsum("...ij,...jk->...ik", self.Lam_0, invSig), axis1=-2, axis2=-1) -
         self.kappa_0/2.0*einsum)