def test_plusmin_mstep(): # Set constants n_seq = 1 T = 2000 # Generate data plusmin = PlusminModel() data, hidden = plusmin.generate_dataset(n_seq, T) n_features = plusmin.x_dim n_components = plusmin.K # Fit reference model and initial MSLDS model refmodel = GaussianHMM(n_components=n_components, covariance_type='full').fit(data) warnings.filterwarnings("ignore", category=DeprecationWarning) # Obtain sufficient statistics from refmodel rlogprob, rstats = reference_estep(refmodel, data) means = refmodel.means_ covars = refmodel.covars_ transmat = refmodel.transmat_ populations = refmodel.startprob_ As = [] for i in range(n_components): As.append(np.zeros((n_features, n_features))) Qs = refmodel.covars_ bs = refmodel.means_ means = refmodel.means_ covars = refmodel.covars_ # Test AQB solver for MSLDS solver = MetastableSwitchingLDSSolver(n_components, n_features) solver.do_mstep(As, Qs, bs, means, covars, rstats)
def test_plusmin_stats(): # Set constants num_hotstart = 3 n_seq = 1 T = 2000 # Generate data plusmin = PlusminModel() data, hidden = plusmin.generate_dataset(n_seq, T) n_features = plusmin.x_dim n_components = plusmin.K # Fit reference model refmodel = GaussianHMM(n_components=n_components, covariance_type='full').fit(data) warnings.filterwarnings("ignore", category=DeprecationWarning) # Fit initial MSLDS model from reference model model = MetastableSwitchingLDS(n_components, n_features, n_hotstart=0) model.inferrer._sequences = data model.means_ = refmodel.means_ model.covars_ = refmodel.covars_ model.transmat_ = refmodel.transmat_ model.populations_ = refmodel.startprob_ model.As_ = [np.zeros((n_features, n_features)), np.zeros((n_features, n_features))] model.Qs_ = refmodel.covars_ model.bs_ = refmodel.means_ iteration = 0 # Remove this step once hot_start is factored out logprob, stats = model.inferrer.do_estep() rlogprob, rstats = reference_estep(refmodel, data) yield lambda: np.testing.assert_array_almost_equal(stats['post'], rstats['post'], decimal=3) yield lambda: np.testing.assert_array_almost_equal(stats['post[1:]'], rstats['post[1:]'], decimal=3) yield lambda: np.testing.assert_array_almost_equal(stats['post[:-1]'], rstats['post[:-1]'], decimal=3) yield lambda: np.testing.assert_array_almost_equal(stats['obs'], rstats['obs'], decimal=3) yield lambda: np.testing.assert_array_almost_equal(stats['obs[1:]'], rstats['obs[1:]'], decimal=3) yield lambda: np.testing.assert_array_almost_equal(stats['obs[:-1]'], rstats['obs[:-1]'], decimal=3) yield lambda: np.testing.assert_array_almost_equal(stats['obs*obs.T'], rstats['obs*obs.T'], decimal=3) yield lambda: np.testing.assert_array_almost_equal( stats['obs*obs[t-1].T'], rstats['obs*obs[t-1].T'], decimal=3) yield lambda: np.testing.assert_array_almost_equal( stats['obs[1:]*obs[1:].T'], rstats['obs[1:]*obs[1:].T'], decimal=3) yield lambda: np.testing.assert_array_almost_equal( stats['obs[:-1]*obs[:-1].T'], rstats['obs[:-1]*obs[:-1].T'], decimal=3) yield lambda: np.testing.assert_array_almost_equal( stats['trans'], rstats['trans'], decimal=1)
def test_plusmin(): # Set constants n_hotstart = 3 n_em_iter = 3 n_experiments = 1 n_seq = 1 T = 2000 gamma = 512. # Generate data plusmin = PlusminModel() data, hidden = plusmin.generate_dataset(n_seq, T) n_features = plusmin.x_dim n_components = plusmin.K # Train MSLDS mslds_scores = [] l = MetastableSwitchingLDS(n_components, n_features, n_hotstart=n_hotstart, n_em_iter=n_em_iter, n_experiments=n_experiments) l.fit(data, gamma=gamma) mslds_score = l.score(data) print("gamma = %f" % gamma) print("MSLDS Log-Likelihood = %f" % mslds_score) print() # Fit Gaussian HMM for comparison g = GaussianFusionHMM(plusmin.K, plusmin.x_dim) g.fit(data) hmm_score = g.score(data) print("HMM Log-Likelihood = %f" % hmm_score) print() # Plot sample from MSLDS sim_xs, sim_Ss = l.sample(T, init_state=0, init_obs=plusmin.mus[0]) sim_xs = np.reshape(sim_xs, (n_seq, T, plusmin.x_dim)) plt.close('all') plt.figure(1) plt.plot(range(T), data[0], label="Observations") plt.plot(range(T), sim_xs[0], label='Sampled Observations') plt.legend() plt.show()