Skip to content

Instantly share code, notes, and snippets.

@mattjj
Last active August 29, 2015 13:57
Show Gist options
  • Save mattjj/9591943 to your computer and use it in GitHub Desktop.
Save mattjj/9591943 to your computer and use it in GitHub Desktop.
test separate state sequences
from __future__ import division
import numpy as np
from matplotlib import pyplot as plt
import pyhsmm
from pyhsmm.util.text import progprint_xrange
obs_hypparams = dict(mu_0=np.zeros(2),sigma_0=np.eye(2),kappa_0=0.05,nu_0=4)
### generate data
true_obs_distns = [pyhsmm.distributions.Gaussian(**obs_hypparams) for i in range(2)]
truemodel = pyhsmm.models.HMM(alpha=2.,init_state_concentration=2.,obs_distns=true_obs_distns)
truemodel.trans_distn.trans_matrix = np.array([[0.9,0.1],[0.1,0.9]])
truemodel.init_state_distn.weights = np.array([0.5,0.5])
data = truemodel.rvs(2000)
datas = np.array_split(data,5)
### fit model with separate state sequences
obs_distns = [pyhsmm.distributions.Gaussian(**obs_hypparams) for i in range(10)]
model = pyhsmm.models.HMM(alpha=0.1,init_state_concentration=0.1,obs_distns=obs_distns)
for d in datas:
model.add_data(d)
likes = []
for itr in progprint_xrange(200):
model.resample_model()
likes.append(model.log_likelihood(data))
plt.plot(likes)
print sum(np.bincount(s.stateseq,minlength=10) for s in model.states_list)
### fit model with one state sequence, initializing at the other fit
obs_distns = [pyhsmm.distributions.Gaussian(**obs_hypparams) for i in range(10)]
model2 = pyhsmm.models.HMM(alpha=0.1,init_state_concentration=0.1,obs_distns=obs_distns)
model2.add_data(data)
likes2 = []
for itr in progprint_xrange(200):
model2.resample_model()
likes2.append(model2.log_likelihood(data))
plt.plot(likes2)
print sum(np.bincount(s.stateseq,minlength=10) for s in model2.states_list)
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment