def test_entropyWish(self): ''' Verify that (wishart) entropy is same for this object and Wishart object ''' Hself = self.distr.entropyWish() wishDistr = WishartDistr(v=self.distr.dF, invW=self.distr.invW) Hwish = wishDistr.get_entropy() assert np.allclose( Hself, Hwish)
def test_entropyWish(self): ''' Verify that (wishart) entropy is same for this object and Wishart object ''' Hself = self.distr.entropyWish() wishDistr = WishartDistr(v=self.distr.dF, invW=self.distr.invW) Hwish = wishDistr.get_entropy() assert np.allclose(Hself, Hwish)
def test_post_update_soVB(self, rho=0.375): distrA = copy.deepcopy(self.distr) distrB = WishartDistr(distrA.v, invW=np.eye(distrA.D)) self.distr.post_update_soVB(rho, distrB) assert self.distr.v == rho * distrA.v + (1 - rho) * distrB.v assert np.allclose(self.distr.invW, rho * distrA.invW + (1 - rho) * distrB.invW)
class TestWishart(object): def setUp(self): self.v = 4 self.invW = np.eye(2) self.distr = WishartDistr(v=self.v, invW=self.invW) def test_dimension(self): assert self.distr.D == self.invW.shape[0] def test_cholinvW(self): cholinvW = self.distr.cholinvW() assert np.allclose(np.dot(cholinvW, cholinvW.T), self.distr.invW) def test_expected_covariance_matrix(self): CovMat = self.distr.ECovMat() MyCovMat = self.invW / (self.v - self.distr.D - 1) print MyCovMat, CovMat assert np.allclose(MyCovMat, CovMat) def test_post_update_soVB(self, rho=0.375): distrA = copy.deepcopy(self.distr) distrB = WishartDistr(distrA.v, invW=np.eye(distrA.D) ) self.distr.post_update_soVB(rho, distrB) assert self.distr.v == rho*distrA.v + (1-rho)*distrB.v assert np.allclose(self.distr.invW, rho*distrA.invW + (1-rho)*distrB.invW) def test_entropy_posterior_gets_smaller(self, N=1): PRNG = np.random.RandomState(seed=8675309) for trial in range(3): X = PRNG.randn(N, self.distr.D) xxT = np.dot(X.T, X) SS = SuffStatBag(K=1, D=self.distr.D) SS.setField('N', [N], dims='K') SS.setField('xxT', [xxT], dims=('K','D','D')) postD = self.distr.get_post_distr(SS, 0) assert postD.D == self.distr.D Hpost = postD.get_entropy() Hprior = self.distr.get_entropy() print 'Prior %.3g, Post %.3g' % (Hprior, Hpost) print self.distr.invW print postD.invW assert Hpost < Hprior
def CreateWithPrior(cls, inferType, priorArgDict, Data): D = Data.dim if inferType == 'EM': obsPrior = None return cls(inferType, D, obsPrior, min_covar=priorArgDict['min_covar']) else: obsPrior = WishartDistr.CreateAsPrior(priorArgDict, Data) return cls(inferType, D, obsPrior)
def CreateWithAllComps(cls, oDict, obsPrior, compDictList): if 'min_covar' in oDict: mc = oDict['min_covar'] self = cls(oDict['inferType'], obsPrior=obsPrior, min_covar=mc) else: self = cls(oDict['inferType'], obsPrior=obsPrior) self.K = len(compDictList) self.comp = [None for k in range(self.K)] if self.inferType == 'EM': for k in xrange(self.K): self.comp[k] = ZMGaussDistr(**compDictList[k]) self.D = self.comp[k].D elif self.inferType.count('VB') > 0: for k in xrange(self.K): self.comp[k] = WishartDistr(**compDictList[k]) self.D = self.comp[k].D return self
class TestWishart(object): def setUp(self): self.v = 4 self.invW = np.eye(2) self.distr = WishartDistr(v=self.v, invW=self.invW) def test_dimension(self): assert self.distr.D == self.invW.shape[0] def test_cholinvW(self): cholinvW = self.distr.cholinvW() assert np.allclose(np.dot(cholinvW, cholinvW.T), self.distr.invW) def test_expected_covariance_matrix(self): CovMat = self.distr.ECovMat() MyCovMat = self.invW / (self.v - self.distr.D - 1) print MyCovMat, CovMat assert np.allclose(MyCovMat, CovMat) def test_post_update_soVB(self, rho=0.375): distrA = copy.deepcopy(self.distr) distrB = WishartDistr(distrA.v, invW=np.eye(distrA.D)) self.distr.post_update_soVB(rho, distrB) assert self.distr.v == rho * distrA.v + (1 - rho) * distrB.v assert np.allclose(self.distr.invW, rho * distrA.invW + (1 - rho) * distrB.invW) def test_entropy_posterior_gets_smaller(self, N=1): PRNG = np.random.RandomState(seed=8675309) for trial in range(3): X = PRNG.randn(N, self.distr.D) xxT = np.dot(X.T, X) SS = SuffStatBag(K=1, D=self.distr.D) SS.setField('N', [N], dims='K') SS.setField('xxT', [xxT], dims=('K', 'D', 'D')) postD = self.distr.get_post_distr(SS, 0) assert postD.D == self.distr.D Hpost = postD.get_entropy() Hprior = self.distr.get_entropy() print 'Prior %.3g, Post %.3g' % (Hprior, Hpost) print self.distr.invW print postD.invW assert Hpost < Hprior
def setUp(self): self.v = 4 self.invW = np.eye(2) self.distr = WishartDistr(v=self.v, invW=self.invW)