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)
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)