def discrete_exhaustive_test(): model = random_model(2) obs_distns = [d.Categorical(K=3,alpha_0=1.),d.Categorical(K=3,alpha_0=1.)] stateseq = np.random.randint(2,size=10) data = np.array([obs_distns[a].rvs() for a in stateseq]) target_val = compute_likelihood_enumeration(obs_distns=obs_distns,data=data,**model) likelihood_check(target_val=target_val,data=data,obs_distns=obs_distns,**model)
def like_hand_test_1(): likelihood_check( obs_distns=[d.Categorical(weights=row) for row in np.eye(2)], trans_matrix=np.eye(2), init_distn=np.array([1., 0.]), data=np.zeros(10, dtype=int), target_val=0.)
def like_hand_test_5(): likelihood_check( obs_distns=[d.Categorical(weights=row) for row in np.eye(2)], trans_matrix=np.array([[0.9, 0.1], [0.2, 0.8]]), init_distn=np.array([1., 0.]), data=np.tile((0, 1), 5), target_val=5 * np.log(0.1) + 4 * np.log(0.2))
def like_hand_test_4(): likelihood_check( obs_distns=[d.Categorical(weights=row) for row in np.eye(2)], trans_matrix=np.array([[0., 1.], [1., 0.]]), init_distn=np.array([1., 0.]), data=np.tile([0, 1], 5).astype(int), target_val=0.)
def likelihood_hand_tests(): yield make_nose_tuple( _likelihood_helper, obs_distns=[d.Categorical(weights=row) for row in np.eye(2)], trans_matrix=np.array([[0.9, 0.1], [0.1, 0.9]]), init_distn=np.array([1., 0.]), data=np.zeros(10, dtype=int), target_val=9 * np.log(0.9)) yield make_nose_tuple( _likelihood_helper, obs_distns=[d.Categorical(weights=row) for row in np.eye(2)], trans_matrix=np.array([[0.9, 0.1], [0.2, 0.8]]), init_distn=np.array([1., 0.]), data=np.tile((0, 1), 5), target_val=5 * np.log(0.1) + 4 * np.log(0.2))
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_exhaustive_tests(): ### discrete data for i in range(2): model = random_model(2) obs_distns = [ d.Categorical(K=3, alpha_0=1.), d.Categorical(K=3, alpha_0=1.) ] stateseq = np.random.randint(2, size=10) data = np.array([obs_distns[a].rvs() for a in stateseq]) target_val = compute_likelihood_enumeration(obs_distns=obs_distns, data=data, **model) yield make_nose_tuple(_likelihood_helper, target_val=target_val, data=data, obs_distns=obs_distns, **model) # Gaussian data for i in range(2): model = random_model(3) obs_distns = [ d.Gaussian(mu=np.random.randn(2), sigma=np.eye(2)), d.Gaussian(mu=np.random.randn(2), sigma=np.eye(2)), d.Gaussian(mu=np.random.randn(2), sigma=np.eye(2)) ] stateseq = np.random.randint(3, size=10) data = np.vstack([obs_distns[a].rvs() for a in stateseq]) target_val = compute_likelihood_enumeration(obs_distns=obs_distns, data=data, **model) yield make_nose_tuple(_likelihood_helper, target_val=target_val, data=data, obs_distns=obs_distns, **model)