Пример #1
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)
Пример #2
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)
Пример #3
0
    def test_data_gradient(self):
        for dim_in in [5, 0]:
            mcgsm = MCGSM(dim_in, 3, 4, 5, 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

            inputs = randn(mcgsm.dim_in, 100)
            outputs = ones_like(mcgsm.sample(inputs))

            # compute density gradient and loglikelihood
            dx, dy, ll = mcgsm._data_gradient(inputs, outputs)

            self.assertLess(
                max(abs(ll - mcgsm.loglikelihood(inputs, outputs))), 1e-8)

            h = 1e-5

            dx_ = zeros_like(dx)
            dy_ = zeros_like(dy)

            for i in range(mcgsm.dim_in):
                inputs_p = inputs.copy()
                inputs_m = inputs.copy()
                inputs_p[i] += h
                inputs_m[i] -= h
                dx_[i] = (mcgsm.loglikelihood(inputs_p, outputs) -
                          mcgsm.loglikelihood(inputs_m, outputs)) / (2. * h)

            for i in range(mcgsm.dim_out):
                outputs_p = outputs.copy()
                outputs_m = outputs.copy()
                outputs_p[i] += h
                outputs_m[i] -= h
                dy_[i] = (mcgsm.loglikelihood(inputs, outputs_p) -
                          mcgsm.loglikelihood(inputs, outputs_m)) / (2. * h)

            self.assertLess(max(abs(dy_ - dy)), 1e-8)
            if mcgsm.dim_in > 0:
                self.assertLess(max(abs(dx_ - dx)), 1e-8)
Пример #4
0
	def test_data_gradient(self):
		for dim_in in [5, 0]:
			mcgsm = MCGSM(dim_in, 3, 4, 5, 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

			inputs = randn(mcgsm.dim_in, 100)
			outputs = ones_like(mcgsm.sample(inputs))

			# compute density gradient and loglikelihood
			dx, dy, ll = mcgsm._data_gradient(inputs, outputs)

			self.assertLess(max(abs(ll - mcgsm.loglikelihood(inputs, outputs))), 1e-8)

			h = 1e-5

			dx_ = zeros_like(dx)
			dy_ = zeros_like(dy)

			for i in range(mcgsm.dim_in):
				inputs_p = inputs.copy()
				inputs_m = inputs.copy()
				inputs_p[i] += h
				inputs_m[i] -= h
				dx_[i] = (
					mcgsm.loglikelihood(inputs_p, outputs) -
					mcgsm.loglikelihood(inputs_m, outputs)) / (2. * h)

			for i in range(mcgsm.dim_out):
				outputs_p = outputs.copy()
				outputs_m = outputs.copy()
				outputs_p[i] += h
				outputs_m[i] -= h
				dy_[i] = (
					mcgsm.loglikelihood(inputs, outputs_p) -
					mcgsm.loglikelihood(inputs, outputs_m)) / (2. * h)

			self.assertLess(max(abs(dy_ - dy)), 1e-8)
			if mcgsm.dim_in > 0:
				self.assertLess(max(abs(dx_ - dx)), 1e-8)
Пример #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)