def testParameterEstimation(self): d = 3 mu = numpy.ones(d) sigma = numpy.eye(d) pdf = MultivariateGaussian(mu, sigma) samples = pdf.random(100000) pdf.estimate(samples) for i in range(d): self.assertAlmostEqual(pdf.mu[i], mu[i], delta=1e-1) for j in range(d): self.assertAlmostEqual(pdf.sigma[i, j], sigma[i, j], delta=1e-1) d = 3 mu = numpy.array([0., 1., 2.]) sigma = numpy.random.random((d, d)) sigma = numpy.dot(sigma, sigma.T) pdf = MultivariateGaussian(mu, sigma) samples = pdf.random(1000000) pdf.estimate(samples) for i in range(d): self.assertAlmostEqual(pdf.mu[i], mu[i], delta=1e-1) for j in range(d): self.assertAlmostEqual(pdf.sigma[i, j], sigma[i, j], delta=1e-1)
def testParameters(self): pdf = MultivariateGaussian(numpy.zeros(3), numpy.eye(3)) d = 2 pdf.mu = numpy.zeros(d) pdf.sigma = numpy.eye(d) self.assertEqual(list(pdf.mu), [0, 0]) self.assertEqual(pdf.sigma.tolist(), numpy.eye(d).tolist())
def testLogProb(self): mg = MultivariateGaussian(numpy.zeros(2), numpy.eye(2)) self.assertAlmostEqual(mg(numpy.zeros(2)), 1. / (2 * numpy.pi), delta=1e-1) self.assertAlmostEqual(mg(numpy.ones(2)), 1. / (2 * numpy.pi) * numpy.exp(-0.5), delta=1e-1)
coords = StructureParser(prot1 + '.pdb').parse().get_coordinates(['CA']) / 4.0 coords2 = StructureParser(prot2 + '.pdb').parse().get_coordinates(['CA']) / 4.0 ## size of fake ensemble ensemble_size = 1000 ## sigma of Gausian noise added to positions to generate random ensemble sigma = 0.05 ## cutoff from which to determine contact frequencies cutoff = 1.8 n_beads = len(coords) if False: ## create data by adding Gaussian noise g = MultivariateGaussian(mu=coords.ravel(), sigma=sigma * numpy.eye(n_beads*3)) ensemble1 = g.random(size=ensemble_size).reshape(ensemble_size, n_beads, 3) g = MultivariateGaussian(mu=coords2.ravel(), sigma=sigma * numpy.eye(n_beads*3)) ensemble2 = g.random(size=ensemble_size).reshape(ensemble_size, n_beads, 3) dms1 = numpy.array(map(distance_matrix, ensemble1)) dms2 = numpy.array(map(distance_matrix, ensemble2)) frequencies1 = numpy.sum(dms1 < cutoff, 0) frequencies2 = numpy.sum(dms2 < cutoff, 0) summed_frequencies = frequencies1 + frequencies2 if False: ## create Poisson-distributed data dm1 = distance_matrix(coords) dm2 = distance_matrix(coords2) cs1 = ensemble_size * (dm1 < cutoff) cs2 = ensemble_size * (dm2 < cutoff)