Пример #1
1
	def test_mogsm(self):
		mcgsm = MCGSM(
			dim_in=0,
			dim_out=3,
			num_components=2,
			num_scales=2,
			num_features=0)

		p0 = 0.3
		p1 = 0.7
		N = 20000
		m0 = array([[2], [0], [0]])
		m1 = array([[0], [2], [1]])
		C0 = cov(randn(mcgsm.dim_out, mcgsm.dim_out**2))
		C1 = cov(randn(mcgsm.dim_out, mcgsm.dim_out**2))
		input = zeros([0, N])
		output = hstack([
			dot(cholesky(C0), randn(mcgsm.dim_out, round(p0 * N))) + m0,
			dot(cholesky(C1), randn(mcgsm.dim_out, round(p1 * N))) + m1]) * (rand(1, N) + 0.5)

		mcgsm.train(input, output, parameters={
			'verbosity': 0,
			'max_iter': 10,
			'train_means': True})

		mogsm = MoGSM(3, 2, 2)

		# translate parameters from MCGSM to MoGSM
		mogsm.priors = sum(exp(mcgsm.priors), 1) / sum(exp(mcgsm.priors))

		for k in range(mogsm.num_components):
			mogsm[k].mean = mcgsm.means[:, k]
			mogsm[k].covariance = inv(dot(mcgsm.cholesky_factors[k], mcgsm.cholesky_factors[k].T))
			mogsm[k].scales = exp(mcgsm.scales[k, :])
			mogsm[k].priors = exp(mcgsm.priors[k, :]) / sum(exp(mcgsm.priors[k, :]))

		self.assertAlmostEqual(mcgsm.evaluate(input, output), mogsm.evaluate(output), 5)

		mogsm_samples = mogsm.sample(N)
		mcgsm_samples = mcgsm.sample(input)

		# generated samples should have the same distribution
		for i in range(mogsm.dim):
			self.assertTrue(ks_2samp(mogsm_samples[i], mcgsm_samples[0]) > 0.0001)
			self.assertTrue(ks_2samp(mogsm_samples[i], mcgsm_samples[1]) > 0.0001)
			self.assertTrue(ks_2samp(mogsm_samples[i], mcgsm_samples[2]) > 0.0001)

		posterior = mcgsm.posterior(input, mcgsm_samples)

		# average posterior should correspond to prior
		for k in range(mogsm.num_components):
			self.assertLess(abs(1 - mean(posterior[k]) / mogsm.priors[k]), 0.1)
Пример #2
0
    def test_basics(self):
        dim_in = 10
        dim_out = 3
        num_components = 7
        num_scales = 5
        num_features = 50
        num_samples = 100

        # create model
        mcgsm = MCGSM(dim_in, dim_out, num_components, num_scales,
                      num_features)

        # generate output
        input = randn(dim_in, num_samples)
        output = mcgsm.sample(input)
        loglik = mcgsm.loglikelihood(input, output)
        post = mcgsm.posterior(input, output)
        samples = mcgsm.sample_posterior(input, output)

        # check hyperparameters
        self.assertEqual(mcgsm.dim_in, dim_in)
        self.assertEqual(mcgsm.dim_out, dim_out)
        self.assertEqual(mcgsm.num_components, num_components)
        self.assertEqual(mcgsm.num_scales, num_scales)
        self.assertEqual(mcgsm.num_features, num_features)

        # check parameters
        self.assertEqual(mcgsm.priors.shape[0], num_components)
        self.assertEqual(mcgsm.priors.shape[1], num_scales)
        self.assertEqual(mcgsm.scales.shape[0], num_components)
        self.assertEqual(mcgsm.scales.shape[1], num_scales)
        self.assertEqual(mcgsm.weights.shape[0], num_components)
        self.assertEqual(mcgsm.weights.shape[1], num_features)
        self.assertEqual(mcgsm.features.shape[0], dim_in)
        self.assertEqual(mcgsm.features.shape[1], num_features)
        self.assertEqual(len(mcgsm.cholesky_factors), num_components)
        self.assertEqual(len(mcgsm.predictors), num_components)
        self.assertEqual(mcgsm.cholesky_factors[0].shape[0], dim_out)
        self.assertEqual(mcgsm.cholesky_factors[0].shape[1], dim_out)
        self.assertEqual(mcgsm.predictors[0].shape[0], dim_out)
        self.assertEqual(mcgsm.predictors[0].shape[1], dim_in)
        self.assertEqual(mcgsm.linear_features.shape[0], num_components)
        self.assertEqual(mcgsm.linear_features.shape[1], dim_in)
        self.assertEqual(mcgsm.means.shape[0], dim_out)
        self.assertEqual(mcgsm.means.shape[1], num_components)

        # check dimensionality of output
        self.assertEqual(output.shape[0], dim_out)
        self.assertEqual(output.shape[1], num_samples)
        self.assertEqual(loglik.shape[0], 1)
        self.assertEqual(loglik.shape[1], num_samples)
        self.assertEqual(post.shape[0], num_components)
        self.assertEqual(post.shape[1], num_samples)
        self.assertLess(max(samples), mcgsm.num_components)
        self.assertGreaterEqual(min(samples), 0)
        self.assertEqual(samples.shape[0], 1)
        self.assertEqual(samples.shape[1], num_samples)
Пример #3
0
    def test_basics(self):
        dim_in = 10
        dim_out = 3
        num_components = 7
        num_scales = 5
        num_features = 50
        num_samples = 100

        # create model
        mcgsm = MCGSM(dim_in, dim_out, num_components, num_scales, num_features)

        # generate output
        input = randn(dim_in, num_samples)
        output = mcgsm.sample(input)
        loglik = mcgsm.loglikelihood(input, output)
        post = mcgsm.posterior(input, output)
        samples = mcgsm.sample_posterior(input, output)

        # check hyperparameters
        self.assertEqual(mcgsm.dim_in, dim_in)
        self.assertEqual(mcgsm.dim_out, dim_out)
        self.assertEqual(mcgsm.num_components, num_components)
        self.assertEqual(mcgsm.num_scales, num_scales)
        self.assertEqual(mcgsm.num_features, num_features)

        # check parameters
        self.assertEqual(mcgsm.priors.shape[0], num_components)
        self.assertEqual(mcgsm.priors.shape[1], num_scales)
        self.assertEqual(mcgsm.scales.shape[0], num_components)
        self.assertEqual(mcgsm.scales.shape[1], num_scales)
        self.assertEqual(mcgsm.weights.shape[0], num_components)
        self.assertEqual(mcgsm.weights.shape[1], num_features)
        self.assertEqual(mcgsm.features.shape[0], dim_in)
        self.assertEqual(mcgsm.features.shape[1], num_features)
        self.assertEqual(len(mcgsm.cholesky_factors), num_components)
        self.assertEqual(len(mcgsm.predictors), num_components)
        self.assertEqual(mcgsm.cholesky_factors[0].shape[0], dim_out)
        self.assertEqual(mcgsm.cholesky_factors[0].shape[1], dim_out)
        self.assertEqual(mcgsm.predictors[0].shape[0], dim_out)
        self.assertEqual(mcgsm.predictors[0].shape[1], dim_in)
        self.assertEqual(mcgsm.linear_features.shape[0], num_components)
        self.assertEqual(mcgsm.linear_features.shape[1], dim_in)
        self.assertEqual(mcgsm.means.shape[0], dim_out)
        self.assertEqual(mcgsm.means.shape[1], num_components)

        # check dimensionality of output
        self.assertEqual(output.shape[0], dim_out)
        self.assertEqual(output.shape[1], num_samples)
        self.assertEqual(loglik.shape[0], 1)
        self.assertEqual(loglik.shape[1], num_samples)
        self.assertEqual(post.shape[0], num_components)
        self.assertEqual(post.shape[1], num_samples)
        self.assertLess(max(samples), mcgsm.num_components)
        self.assertGreaterEqual(min(samples), 0)
        self.assertEqual(samples.shape[0], 1)
        self.assertEqual(samples.shape[1], num_samples)
Пример #4
0
    def test_mogsm(self):
        mcgsm = MCGSM(dim_in=0,
                      dim_out=3,
                      num_components=2,
                      num_scales=2,
                      num_features=0)

        p0 = 0.3
        p1 = 0.7
        N = 20000
        m0 = array([[2], [0], [0]])
        m1 = array([[0], [2], [1]])
        C0 = cov(randn(mcgsm.dim_out, mcgsm.dim_out**2))
        C1 = cov(randn(mcgsm.dim_out, mcgsm.dim_out**2))
        input = zeros([0, N])
        output = hstack([
            dot(cholesky(C0), randn(mcgsm.dim_out, round(p0 * N))) + m0,
            dot(cholesky(C1), randn(mcgsm.dim_out, round(p1 * N))) + m1
        ]) * (rand(1, N) + 0.5)

        mcgsm.train(input,
                    output,
                    parameters={
                        'verbosity': 0,
                        'max_iter': 10,
                        'train_means': True
                    })

        mogsm = MoGSM(3, 2, 2)

        # translate parameters from MCGSM to MoGSM
        mogsm.priors = sum(exp(mcgsm.priors), 1) / sum(exp(mcgsm.priors))

        for k in range(mogsm.num_components):
            mogsm[k].mean = mcgsm.means[:, k]
            mogsm[k].covariance = inv(
                dot(mcgsm.cholesky_factors[k], mcgsm.cholesky_factors[k].T))
            mogsm[k].scales = exp(mcgsm.scales[k, :])
            mogsm[k].priors = exp(mcgsm.priors[k, :]) / sum(
                exp(mcgsm.priors[k, :]))

        self.assertAlmostEqual(mcgsm.evaluate(input, output),
                               mogsm.evaluate(output), 5)

        mogsm_samples = mogsm.sample(N)
        mcgsm_samples = mcgsm.sample(input)

        # generated samples should have the same distribution
        for i in range(mogsm.dim):
            self.assertTrue(
                ks_2samp(mogsm_samples[i], mcgsm_samples[0]) > 0.0001)
            self.assertTrue(
                ks_2samp(mogsm_samples[i], mcgsm_samples[1]) > 0.0001)
            self.assertTrue(
                ks_2samp(mogsm_samples[i], mcgsm_samples[2]) > 0.0001)

        posterior = mcgsm.posterior(input, mcgsm_samples)

        # average posterior should correspond to prior
        for k in range(mogsm.num_components):
            self.assertLess(abs(1 - mean(posterior[k]) / mogsm.priors[k]), 0.1)
Пример #5
0
Файл: speed.py Проект: cajal/cmt
model = MCGSM(
	dim_in=args.dim_in,
	dim_out=args.dim_out,
	num_components=12,
	num_features=40,
	num_scales=6)

###
print 'model.loglikelihood'
t = time()
for r in range(args.repetitions):
	model.loglikelihood(*data)
print '{0:12.8f} seconds'.format((time() - t) / float(args.repetitions))
print

###
print 'model._check_performance'
for batch_size in [1000, 2000, 5000]:
	t = model._check_performance(*data, repetitions=args.repetitions, parameters={'batch_size': batch_size})
	print '{0:12.8f} seconds ({1})'.format(t, batch_size)
print

###
print 'model.posterior'
t = time()
for r in range(args.repetitions):
	model.posterior(*data)
print '{0:12.8f} seconds'.format((time() - t) / float(args.repetitions))
print
Пример #6
0
model = MCGSM(dim_in=args.dim_in,
              dim_out=args.dim_out,
              num_components=12,
              num_features=40,
              num_scales=6)

###
print 'model.loglikelihood'
t = time()
for r in range(args.repetitions):
    model.loglikelihood(*data)
print '{0:12.8f} seconds'.format((time() - t) / float(args.repetitions))
print

###
print 'model._check_performance'
for batch_size in [1000, 2000, 5000]:
    t = model._check_performance(*data,
                                 repetitions=args.repetitions,
                                 parameters={'batch_size': batch_size})
    print '{0:12.8f} seconds ({1})'.format(t, batch_size)
print

###
print 'model.posterior'
t = time()
for r in range(args.repetitions):
    model.posterior(*data)
print '{0:12.8f} seconds'.format((time() - t) / float(args.repetitions))
print