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))
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)
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))
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)
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)
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)
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)