Source code for pmlearn.mixture.tests.test_gaussian_mixture

import unittest
import shutil
import tempfile

import numpy as np
# import pandas as pd
# import pymc3 as pm
# from pymc3 import summary
# from sklearn.mixture import GaussianMixture as skGaussianMixture
from sklearn.model_selection import train_test_split

from pmlearn.exceptions import NotFittedError
from pmlearn.mixture import GaussianMixture


[docs]class GaussianMixtureTestCase(unittest.TestCase):
[docs] def setUp(self): self.num_components = 3 self.num_pred = 1 self.num_training_samples = 100 self.pi = np.array([0.35, 0.4, 0.25]) self.means = np.array([0, 5, 10]) self.sigmas = np.array([0.5, 0.5, 1.0]) self.components = np.random.randint(0, self.num_components, self.num_training_samples) X = np.random.normal(loc=self.means[self.components], scale=self.sigmas[self.components]) X.shape = (self.num_training_samples, 1) self.X_train, self.X_test = train_test_split(X, test_size=0.3) self.test_GMM = GaussianMixture() self.test_nuts_GMM = GaussianMixture() self.test_dir = tempfile.mkdtemp()
[docs] def tearDown(self): shutil.rmtree(self.test_dir)
# class GaussianMixtureFitTestCase(GaussianMixtureTestCase): # def test_advi_fit_returns_correct_model(self): # # This print statement ensures PyMC3 output won't overwrite the test name # print('') # self.test_GMM.fit(self.X_train) # # self.assertEqual(self.num_pred, self.test_GMM.num_pred) # self.assertEqual(self.num_components, self.test_GMM.num_components) # # self.assertAlmostEqual(self.pi[0], # self.test_GMM.summary['mean']['pi__0'], # 0) # self.assertAlmostEqual(self.pi[1], # self.test_GMM.summary['mean']['pi__1'], # 0) # self.assertAlmostEqual(self.pi[2], # self.test_GMM.summary['mean']['pi__2'], # 0) # # self.assertAlmostEqual( # self.means[0], # self.test_GMM.summary['mean']['cluster_center_0__0'], # 0) # self.assertAlmostEqual( # self.means[1], # self.test_GMM.summary['mean']['cluster_center_1__0'], # 0) # self.assertAlmostEqual( # self.means[2], # self.test_GMM.summary['mean']['cluster_center_2__0'], # 0) # # self.assertAlmostEqual( # self.sigmas[0], # self.test_GMM.summary['mean']['cluster_variance_0__0'], # 0) # self.assertAlmostEqual( # self.sigmas[1], # self.test_GMM.summary['mean']['cluster_variance_1__0'], # 0) # self.assertAlmostEqual( # self.sigmas[2], # self.test_GMM.summary['mean']['cluster_variance_2__0'], # 0) # # def test_nuts_fit_returns_correct_model(self): # # This print statement ensures PyMC3 output won't overwrite the test name # print('') # self.test_nuts_GMM.fit(self.X_train, # inference_type='nuts') # # self.assertEqual(self.num_pred, self.test_nuts_GMM.num_pred) # self.assertEqual(self.num_components, self.test_nuts_GMM.num_components) # # self.assertAlmostEqual(self.pi[0], # self.test_nuts_GMM.summary['mean']['pi__0'], # 0) # self.assertAlmostEqual(self.pi[1], # self.test_nuts_GMM.summary['mean']['pi__1'], # 0) # self.assertAlmostEqual(self.pi[2], # self.test_nuts_GMM.summary['mean']['pi__2'], # 0) # # self.assertAlmostEqual( # self.means[0], # self.test_nuts_GMM.summary['mean']['cluster_center_0__0'], # 0) # self.assertAlmostEqual( # self.means[1], # self.test_nuts_GMM.summary['mean']['cluster_center_1__0'], # 0) # self.assertAlmostEqual( # self.means[2], # self.test_nuts_GMM.summary['mean']['cluster_center_2__0'], # 0) # # self.assertAlmostEqual( # self.sigmas[0], # self.test_nuts_GMM.summary['mean']['cluster_variance_0__0'], # 0) # self.assertAlmostEqual( # self.sigmas[1], # self.test_nuts_GMM.summary['mean']['cluster_variance_1__0'], # 0) # self.assertAlmostEqual( # self.sigmas[2], # self.test_nuts_GMM.summary['mean']['cluster_variance_2__0'], # 0) # #
[docs]class GaussianMixturePredictTestCase(GaussianMixtureTestCase): # def test_predict_returns_predictions(self): # print('') # self.test_GMM.fit(self.X_train, self.y_train) # preds = self.test_GMM.predict(self.X_test) # self.assertEqual(self.y_test.shape, preds.shape) # def test_predict_returns_mean_predictions_and_std(self): # print('') # self.test_GMM.fit(self.X_train, self.y_train) # preds, stds = self.test_GMM.predict(self.X_test, return_std=True) # self.assertEqual(self.y_test.shape, preds.shape) # self.assertEqual(self.y_test.shape, stds.shape)
[docs] def test_predict_raises_error_if_not_fit(self): print('') with self.assertRaises(NotFittedError) as no_fit_error: test_GMM = GaussianMixture() test_GMM.predict(self.X_train) expected = 'Run fit on the model before predict.' self.assertEqual(str(no_fit_error.exception), expected)
# class GaussianMixtureScoreTestCase(GaussianMixtureTestCase): # def test_score_matches_sklearn_performance(self): # print('') # skGMM = skGaussianMixture(n_components=3) # skGMM.fit(self.X_train) # skGMM_score = skGMM.score(self.X_test) # # self.test_GMM.fit(self.X_train) # test_GMM_score = self.test_GMM.score(self.X_test) # # self.assertAlmostEqual(skGMM_score, test_GMM_score, 0) # # # class GaussianMixtureSaveAndLoadTestCase(GaussianMixtureTestCase): # def test_save_and_load_work_correctly(self): # print('') # self.test_GMM.fit(self.X_train) # score1 = self.test_GMM.score(self.X_test) # self.test_GMM.save(self.test_dir) # # GMM2 = GaussianMixture() # GMM2.load(self.test_dir) # # self.assertEqual(self.test_GMM.inference_type, GMM2.inference_type) # self.assertEqual(self.test_GMM.num_pred, GMM2.num_pred) # self.assertEqual(self.test_GMM.num_training_samples, # GMM2.num_training_samples) # pd.testing.assert_frame_equal(summary(self.test_GMM.trace), # summary(GMM2.trace)) # # score2 = GMM2.score(self.X_test) # self.assertAlmostEqual(score1, score2, 0)