Пример #1
0
    def test_conditional_loglikelihood(self):
        mcgsm = MCGSM(3, 1, 2, 1, 4)

        mcgsm.linear_features = randn(mcgsm.num_components, mcgsm.dim_in) / 5.
        mcgsm.means = randn(mcgsm.dim_out, mcgsm.num_components) / 5.

        M = 100

        inputs = randn(mcgsm.dim_in, M)
        outputs = mcgsm.sample(inputs)

        loglik0 = mcgsm.loglikelihood(inputs, outputs)
        loglik1 = []

        N = 1000

        # estimate log-likelihood via sampling
        for _ in range(N):
            labels = mcgsm.sample_prior(inputs)
            loglik1.append(mcgsm.loglikelihood(inputs, outputs, labels))

        loglik1 = vstack(loglik1)

        d = abs(logmeanexp(loglik1, 0) - loglik0).ravel()
        s = std(loglik1, 0, ddof=1).ravel()

        for i in range(M):
            self.assertLess(d[i], 6. * s[i] / sqrt(N))
Пример #2
0
    def test_pickle(self):
        mcgsm0 = MCGSM(11, 2, 4, 7, 21)

        mcgsm0.linear_features = randn(mcgsm0.num_components, mcgsm0.dim_in)
        mcgsm0.means = randn(mcgsm0.dim_out, mcgsm0.num_components)

        tmp_file = mkstemp()[1]

        # store model
        with open(tmp_file, "w") as handle:
            dump({"mcgsm": mcgsm0}, handle)

            # load model
        with open(tmp_file) as handle:
            mcgsm1 = load(handle)["mcgsm"]

            # make sure parameters haven't changed
        self.assertEqual(mcgsm0.dim_in, mcgsm1.dim_in)
        self.assertEqual(mcgsm0.dim_out, mcgsm1.dim_out)
        self.assertEqual(mcgsm0.num_components, mcgsm1.num_components)
        self.assertEqual(mcgsm0.num_scales, mcgsm1.num_scales)
        self.assertEqual(mcgsm0.num_features, mcgsm1.num_features)

        self.assertLess(max(abs(mcgsm0.scales - mcgsm1.scales)), 1e-20)
        self.assertLess(max(abs(mcgsm0.weights - mcgsm1.weights)), 1e-20)
        self.assertLess(max(abs(mcgsm0.features - mcgsm1.features)), 1e-20)
        self.assertLess(max(abs(mcgsm0.linear_features - mcgsm1.linear_features)), 1e-20)
        self.assertLess(max(abs(mcgsm0.means - mcgsm1.means)), 1e-20)

        for chol0, chol1 in zip(mcgsm0.cholesky_factors, mcgsm1.cholesky_factors):
            self.assertLess(max(abs(chol0 - chol1)), 1e-20)

        for pred0, pred1 in zip(mcgsm0.predictors, mcgsm1.predictors):
            self.assertLess(max(abs(pred0 - pred1)), 1e-20)
Пример #3
0
    def test_conditional_loglikelihood(self):
        mcgsm = MCGSM(3, 1, 2, 1, 4)

        mcgsm.linear_features = randn(mcgsm.num_components, mcgsm.dim_in) / 5.0
        mcgsm.means = randn(mcgsm.dim_out, mcgsm.num_components) / 5.0

        M = 100

        inputs = randn(mcgsm.dim_in, M)
        outputs = mcgsm.sample(inputs)

        loglik0 = mcgsm.loglikelihood(inputs, outputs)
        loglik1 = []

        N = 1000

        # estimate log-likelihood via sampling
        for _ in range(N):
            labels = mcgsm.sample_prior(inputs)
            loglik1.append(mcgsm.loglikelihood(inputs, outputs, labels))

        loglik1 = vstack(loglik1)

        d = abs(logmeanexp(loglik1, 0) - loglik0).ravel()
        s = std(loglik1, 0, ddof=1).ravel()

        for i in range(M):
            self.assertLess(d[i], 6.0 * s[i] / sqrt(N))
Пример #4
0
    def test_gradient(self):
        mcgsm = MCGSM(5, 2, 2, 4, 10)

        cholesky_factors = []
        for k in range(mcgsm.num_components):
            cholesky_factors.append(cholesky(cov(randn(mcgsm.dim_out, mcgsm.dim_out ** 2))))
        mcgsm.cholesky_factors = cholesky_factors

        mcgsm.linear_features = randn(mcgsm.num_components, mcgsm.dim_in) / 5.0
        mcgsm.means = randn(mcgsm.dim_out, mcgsm.num_components) / 5.0

        err = mcgsm._check_gradient(randn(mcgsm.dim_in, 1000), randn(mcgsm.dim_out, 1000), 1e-5)
        self.assertLess(err, 1e-8)

        # without regularization
        for param in ["priors", "scales", "weights", "features", "chol", "pred", "linear_features", "means"]:
            err = mcgsm._check_gradient(
                randn(mcgsm.dim_in, 1000),
                randn(mcgsm.dim_out, 1000),
                1e-5,
                parameters={
                    "train_prior": param == "priors",
                    "train_scales": param == "scales",
                    "train_weights": param == "weights",
                    "train_features": param == "features",
                    "train_cholesky_factors": param == "chol",
                    "train_predictors": param == "pred",
                    "train_linear_features": param == "linear_features",
                    "train_means": param == "means",
                },
            )
            self.assertLess(err, 1e-8)

            # with regularization
        for norm in ["L1", "L2"]:
            for param in ["priors", "scales", "weights", "features", "chol", "pred", "linear_features", "means"]:
                err = mcgsm._check_gradient(
                    randn(mcgsm.dim_in, 1000),
                    randn(mcgsm.dim_out, 1000),
                    1e-7,
                    parameters={
                        "train_prior": param == "priors",
                        "train_scales": param == "scales",
                        "train_weights": param == "weights",
                        "train_features": param == "features",
                        "train_cholesky_factors": param == "chol",
                        "train_predictors": param == "pred",
                        "train_linear_features": param == "linear_features",
                        "train_means": param == "means",
                        "regularize_features": {"strength": 0.4, "norm": norm},
                        "regularize_predictors": {"strength": 0.5, "norm": norm},
                        "regularize_weights": {"strength": 0.7, "norm": norm},
                        "regularize_linear_features": {"strength": 0.3, "norm": norm},
                        "regularize_means": {"strength": 0.6, "norm": norm},
                    },
                )
                self.assertLess(err, 1e-6)
Пример #5
0
	def test_gradient(self):
		mcgsm = MCGSM(5, 2, 2, 4, 10)

		cholesky_factors = []
		for k in range(mcgsm.num_components):
			cholesky_factors.append(cholesky(cov(randn(mcgsm.dim_out, mcgsm.dim_out**2))))
		mcgsm.cholesky_factors = cholesky_factors

		mcgsm.linear_features = randn(mcgsm.num_components, mcgsm.dim_in) / 5.
		mcgsm.means = randn(mcgsm.dim_out, mcgsm.num_components) / 5.

		err = mcgsm._check_gradient(
			randn(mcgsm.dim_in, 1000),
			randn(mcgsm.dim_out, 1000), 1e-5)
		self.assertLess(err, 1e-8)

		# without regularization
		for param in ['priors', 'scales', 'weights', 'features', 'chol', 'pred', 'linear_features', 'means']:
			err = mcgsm._check_gradient(
				randn(mcgsm.dim_in, 1000),
				randn(mcgsm.dim_out, 1000),
				1e-5,
				parameters={
					'train_prior': param == 'priors',
					'train_scales': param == 'scales',
					'train_weights': param == 'weights',
					'train_features': param == 'features',
					'train_cholesky_factors': param == 'chol',
					'train_predictors': param == 'pred',
					'train_linear_features': param == 'linear_features',
					'train_means': param == 'means',
				})
			self.assertLess(err, 1e-8)

		# with regularization
		for norm in ['L1', 'L2']:
			for param in ['priors', 'scales', 'weights', 'features', 'chol', 'pred', 'linear_features', 'means']:
				err = mcgsm._check_gradient(
					randn(mcgsm.dim_in, 1000),
					randn(mcgsm.dim_out, 1000),
					1e-7,
					parameters={
						'train_prior': param == 'priors',
						'train_scales': param == 'scales',
						'train_weights': param == 'weights',
						'train_features': param == 'features',
						'train_cholesky_factors': param == 'chol',
						'train_predictors': param == 'pred',
						'train_linear_features': param == 'linear_features',
						'train_means': param == 'means',
						'regularize_features': {'strength': 0.4, 'norm': norm},
						'regularize_predictors': {'strength': 0.5, 'norm': norm},
						'regularize_weights': {'strength': 0.7, 'norm': norm},
						'regularize_linear_features': {'strength': 0.3, 'norm': norm},
						'regularize_means': {'strength': 0.6, 'norm': norm},
					})
				self.assertLess(err, 1e-6)
Пример #6
0
    def test_pickle(self):
        mcgsm0 = MCGSM(11, 2, 4, 7, 21)

        mcgsm0.linear_features = randn(mcgsm0.num_components, mcgsm0.dim_in)
        mcgsm0.means = randn(mcgsm0.dim_out, mcgsm0.num_components)

        tmp_file = mkstemp()[1]

        # store model
        with open(tmp_file, 'w') as handle:
            dump({'mcgsm': mcgsm0}, handle)

        # load model
        with open(tmp_file) as handle:
            mcgsm1 = load(handle)['mcgsm']

        # make sure parameters haven't changed
        self.assertEqual(mcgsm0.dim_in, mcgsm1.dim_in)
        self.assertEqual(mcgsm0.dim_out, mcgsm1.dim_out)
        self.assertEqual(mcgsm0.num_components, mcgsm1.num_components)
        self.assertEqual(mcgsm0.num_scales, mcgsm1.num_scales)
        self.assertEqual(mcgsm0.num_features, mcgsm1.num_features)

        self.assertLess(max(abs(mcgsm0.scales - mcgsm1.scales)), 1e-20)
        self.assertLess(max(abs(mcgsm0.weights - mcgsm1.weights)), 1e-20)
        self.assertLess(max(abs(mcgsm0.features - mcgsm1.features)), 1e-20)
        self.assertLess(
            max(abs(mcgsm0.linear_features - mcgsm1.linear_features)), 1e-20)
        self.assertLess(max(abs(mcgsm0.means - mcgsm1.means)), 1e-20)

        for chol0, chol1 in zip(mcgsm0.cholesky_factors,
                                mcgsm1.cholesky_factors):
            self.assertLess(max(abs(chol0 - chol1)), 1e-20)

        for pred0, pred1 in zip(mcgsm0.predictors, mcgsm1.predictors):
            self.assertLess(max(abs(pred0 - pred1)), 1e-20)
Пример #7
0
    def test_gradient(self):
        mcgsm = MCGSM(5, 2, 2, 4, 10)

        cholesky_factors = []
        for k in range(mcgsm.num_components):
            cholesky_factors.append(
                cholesky(cov(randn(mcgsm.dim_out, mcgsm.dim_out**2))))
        mcgsm.cholesky_factors = cholesky_factors

        mcgsm.linear_features = randn(mcgsm.num_components, mcgsm.dim_in) / 5.
        mcgsm.means = randn(mcgsm.dim_out, mcgsm.num_components) / 5.

        err = mcgsm._check_gradient(randn(mcgsm.dim_in, 1000),
                                    randn(mcgsm.dim_out, 1000), 1e-5)
        self.assertLess(err, 1e-8)

        # without regularization
        for param in [
                'priors', 'scales', 'weights', 'features', 'chol', 'pred',
                'linear_features', 'means'
        ]:
            err = mcgsm._check_gradient(
                randn(mcgsm.dim_in, 1000),
                randn(mcgsm.dim_out, 1000),
                1e-5,
                parameters={
                    'train_prior': param == 'priors',
                    'train_scales': param == 'scales',
                    'train_weights': param == 'weights',
                    'train_features': param == 'features',
                    'train_cholesky_factors': param == 'chol',
                    'train_predictors': param == 'pred',
                    'train_linear_features': param == 'linear_features',
                    'train_means': param == 'means',
                })
            self.assertLess(err, 1e-8)

        # with regularization
        for norm in ['L1', 'L2']:
            for param in [
                    'priors', 'scales', 'weights', 'features', 'chol', 'pred',
                    'linear_features', 'means'
            ]:
                err = mcgsm._check_gradient(
                    randn(mcgsm.dim_in, 1000),
                    randn(mcgsm.dim_out, 1000),
                    1e-7,
                    parameters={
                        'train_prior': param == 'priors',
                        'train_scales': param == 'scales',
                        'train_weights': param == 'weights',
                        'train_features': param == 'features',
                        'train_cholesky_factors': param == 'chol',
                        'train_predictors': param == 'pred',
                        'train_linear_features': param == 'linear_features',
                        'train_means': param == 'means',
                        'regularize_features': {
                            'strength': 0.4,
                            'norm': norm
                        },
                        'regularize_predictors': {
                            'strength': 0.5,
                            'norm': norm
                        },
                        'regularize_weights': {
                            'strength': 0.7,
                            'norm': norm
                        },
                        'regularize_linear_features': {
                            'strength': 0.3,
                            'norm': norm
                        },
                        'regularize_means': {
                            'strength': 0.6,
                            'norm': norm
                        },
                    })
                self.assertLess(err, 1e-6)