pythonmachine-learningtime-serieshidden-markov-modelshmmlearn

how to run hidden markov models in Python with hmmlearn?


I tried to use hmmlearn from GitHub to run a binary hidden markov model. This does not work:

import hmmlearn.hmm as hmm
transmat = np.array([[0.7, 0.3],
                      [0.3, 0.7]])
emitmat = np.array([[0.9, 0.1],
                    [0.2, 0.8]])
obs = np.array([0, 0, 1, 0, 0])
startprob = np.array([0.5, 0.5])
h = hmm.MultinomialHMM(n_components=2, startprob=startprob,
                       transmat=transmat)
h.emissionprob_ = emitmat
# fails
h.fit([0, 0, 1, 0, 0])
# fails
h.decode([0, 0, 1, 0, 0])
print h

I get this error:

ValueError: zero-dimensional arrays cannot be concatenated

What is the right way to use this module? Note I am using the version of hmmlearn that was separated from sklearn, because apparently sklearn doesn't maintain hmmlearn anymore.


Solution

  • Fit accepts list of sequences and not a single sequence (as in general you can have multiple, independent sequences observed from different runs of your experiments/observations). Thus simply put your list inside another list

    import hmmlearn.hmm as hmm
    import numpy as np
    
    transmat = np.array([[0.7, 0.3],
                          [0.3, 0.7]])
    emitmat = np.array([[0.9, 0.1],
                        [0.2, 0.8]])
    
    startprob = np.array([0.5, 0.5])
    h = hmm.MultinomialHMM(n_components=2, startprob=startprob,
                           transmat=transmat)
    h.emissionprob_ = emitmat
    # works fine
    h.fit([[0, 0, 1, 0, 0]]) 
    # h.fit([[0, 0, 1, 0, 0], [0, 0], [1,1,1]]) # this is the reason for such 
                                                # syntax, you can fit to multiple
                                                # sequences    
    print h.decode([0, 0, 1, 0, 0])
    print h
    

    gives

    (-4.125363362578882, array([1, 1, 1, 1, 1]))
    MultinomialHMM(algorithm='viterbi',
            init_params='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
            n_components=2, n_iter=10,
            params='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
            random_state=<mtrand.RandomState object at 0x7fe245ac7510>,
            startprob=None, startprob_prior=1.0, thresh=0.01, transmat=None,
            transmat_prior=1.0)