def discrete_geweke_test(fig): Nstates = 2 Nemissions = 2 alpha = 3. init_state_concentration=3. T = 10 num_iter = 10000 num_checks = 10 obs_distns = [distributions.Categorical(K=Nemissions,alpha_0=1.) for _ in range(Nstates)] hmm = models.HMM( alpha=alpha,init_state_concentration=init_state_concentration, obs_distns=obs_distns) # generate state sequences and parameters from the prior prior_stateseqs = [] prior_weights = [] for itr in xrange(num_iter): hmm.resample_model() # sample parameters from the prior _, stateseq = hmm.generate(T,keep=False) prior_stateseqs.append(stateseq) prior_weights.append(hmm.obs_distns[0].weights) prior_stateseqs = np.array(prior_stateseqs) prior_weights = np.array(prior_weights) # generate state sequences and parameters using Gibbs hmm.generate(T,keep=True) s = hmm.states_list[0] gibbs_stateseqs = [] gibbs_weights = [] for itr in xrange(num_iter): s.generate_obs() # resamples data given state sequence, obs params hmm.resample_model() # resamples everything else as usual gibbs_stateseqs.append(s.stateseq) gibbs_weights.append(hmm.obs_distns[0].weights) gibbs_stateseqs = np.array(gibbs_stateseqs) gibbs_weights = np.array(gibbs_weights) # test that they look similar by checking probability of co-assignment time_indices = np.arange(T) for itr in xrange(num_checks): i,j = np.random.choice(time_indices,replace=False,size=2) prior_prob_of_coassignment = (prior_stateseqs[:,i] == prior_stateseqs[:,j]).std() gibbs_prob_of_coassignment = (gibbs_stateseqs[:,i] == gibbs_stateseqs[:,j]).std() assert np.isclose( prior_prob_of_coassignment,gibbs_prob_of_coassignment, rtol=0.025,atol=0.025, ) # test that they look similar by checking parameters testing.populations_eq_quantile_plot(prior_weights,gibbs_weights,fig=fig) figpath = os.path.join(figure_dir_path,'discrete_geweke_test_weights.pdf') plt.savefig(figpath)
def _likelihood_helper(obs_distns, trans_matrix, init_distn, data, target_val): hmm = m.HMM( alpha=6, gamma=6, init_state_concentration=1, # placeholders obs_distns=obs_distns) hmm.trans_distn.A = trans_matrix hmm.init_state_distn.weights = init_distn hmm.add_data(data) assert np.isclose(hmm.log_likelihood(), target_val)
### generate data num_modes = 3 true_obs_distns = [ distributions.Gaussian(**obs_hypparams) for i in range(num_modes) ] data = np.concatenate( [true_obs_distns[i % num_modes].rvs(25) for i in range(25)]) ## inference! hmm = models.HMM(obs_distns=[ distributions.Gaussian(**obs_hypparams) for i in range(num_modes * 3) ], alpha=3., init_state_concentration=1.) hmm.add_data(data) hmm.meanfield_coordinate_descent_step() scores = [hmm.meanfield_coordinate_descent_step() for i in range(50)] scores = np.array(scores) hmm.plot() plt.figure() plt.plot(scores) def normalize(A): return A / A.sum(1)[:, None]