.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/plot_hmm_sampling_and_decoding.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_plot_hmm_sampling_and_decoding.py: Sampling from and decoding an HMM --------------------------------- This script shows how to sample points from a Hidden Markov Model (HMM): we use a 4-state model with specified mean and covariance. The plot shows the sequence of observations generated with the transitions between them. We can see that, as specified by our transition matrix, there are no transition between component 1 and 3. Then, we decode our model to recover the input parameters. .. GENERATED FROM PYTHON SOURCE LINES 14-63 .. code-block:: Python import numpy as np import matplotlib.pyplot as plt from hmmlearn import hmm # Prepare parameters for a 4-components HMM # Initial population probability startprob = np.array([0.6, 0.3, 0.1, 0.0]) # The transition matrix, note that there are no transitions possible # between component 1 and 3 transmat = np.array([[0.7, 0.2, 0.0, 0.1], [0.3, 0.5, 0.2, 0.0], [0.0, 0.3, 0.5, 0.2], [0.2, 0.0, 0.2, 0.6]]) # The means of each component means = np.array([[0.0, 0.0], [0.0, 11.0], [9.0, 10.0], [11.0, -1.0]]) # The covariance of each component covars = .5 * np.tile(np.identity(2), (4, 1, 1)) # Build an HMM instance and set parameters gen_model = hmm.GaussianHMM(n_components=4, covariance_type="full") # Instead of fitting it from the data, we directly set the estimated # parameters, the means and covariance of the components gen_model.startprob_ = startprob gen_model.transmat_ = transmat gen_model.means_ = means gen_model.covars_ = covars # Generate samples X, Z = gen_model.sample(500) # Plot the sampled data fig, ax = plt.subplots() ax.plot(X[:, 0], X[:, 1], ".-", label="observations", ms=6, mfc="orange", alpha=0.7) # Indicate the component numbers for i, m in enumerate(means): ax.text(m[0], m[1], 'Component %i' % (i + 1), size=17, horizontalalignment='center', bbox=dict(alpha=.7, facecolor='w')) ax.legend(loc='best') fig.show() .. image-sg:: /auto_examples/images/sphx_glr_plot_hmm_sampling_and_decoding_001.png :alt: plot hmm sampling and decoding :srcset: /auto_examples/images/sphx_glr_plot_hmm_sampling_and_decoding_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 64-65 Now, let's ensure we can recover our parameters. .. GENERATED FROM PYTHON SOURCE LINES 65-90 .. code-block:: Python scores = list() models = list() for n_components in (3, 4, 5): for idx in range(10): # define our hidden Markov model model = hmm.GaussianHMM(n_components=n_components, covariance_type='full', random_state=idx) model.fit(X[:X.shape[0] // 2]) # 50/50 train/validate models.append(model) scores.append(model.score(X[X.shape[0] // 2:])) print(f'Converged: {model.monitor_.converged}' f'\tScore: {scores[-1]}') # get the best model model = models[np.argmax(scores)] n_states = model.n_components print(f'The best model had a score of {max(scores)} and {n_states} ' 'states') # use the Viterbi algorithm to predict the most likely sequence of states # given the model states = model.predict(X) .. rst-class:: sphx-glr-script-out .. code-block:: none Converged: True Score: -1533.6264948313305 Converged: True Score: -1400.3425542538316 Converged: True Score: -1086.0172524920695 Converged: True Score: -1128.6441258839927 Converged: True Score: -1161.7850652843913 Converged: True Score: -1108.380452283654 Converged: True Score: -1108.3804522836508 Converged: True Score: -1108.380452283653 Converged: True Score: -1108.380452283651 Converged: True Score: -1108.3804522836563 Converged: True Score: -929.8317668068415 Converged: True Score: -1130.1414502094603 Converged: True Score: -1112.6381730799492 Converged: True Score: -1187.1140171561422 Converged: True Score: -908.4368922202966 Converged: True Score: -1055.3936559931078 Converged: True Score: -954.1216708646954 Converged: True Score: -908.4368922202949 Converged: True Score: -908.436892220294 Converged: True Score: -908.4368922202974 Converged: True Score: -1098.1383120991134 Converged: True Score: -955.772564619858 Converged: True Score: -923.7392150141758 Converged: True Score: -1000.2119092525699 Converged: True Score: -911.4708646693164 Converged: True Score: -1176.208037942385 Converged: True Score: -870.8031468570575 Converged: True Score: -1073.468210791878 Converged: True Score: -1009.4725694467653 Converged: True Score: -1063.5402807908533 The best model had a score of -870.8031468570575 and 5 states .. GENERATED FROM PYTHON SOURCE LINES 91-97 Let's plot our states compared to those generated and our transition matrix to get a sense of our model. We can see that the recovered states follow the same path as the generated states, just with the identities of the states transposed (i.e. instead of following a square as in the first figure, the nodes are switch around but this does not change the basic pattern). The same is true for the transition matrix. .. GENERATED FROM PYTHON SOURCE LINES 97-118 .. code-block:: Python # plot model states over time fig, ax = plt.subplots() ax.plot(Z, states) ax.set_title('States compared to generated') ax.set_xlabel('Generated State') ax.set_ylabel('Recovered State') fig.show() # plot the transition matrix fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 5)) ax1.imshow(gen_model.transmat_, aspect='auto', cmap='spring') ax1.set_title('Generated Transition Matrix') ax2.imshow(model.transmat_, aspect='auto', cmap='spring') ax2.set_title('Recovered Transition Matrix') for ax in (ax1, ax2): ax.set_xlabel('State To') ax.set_ylabel('State From') fig.tight_layout() fig.show() .. rst-class:: sphx-glr-horizontal * .. image-sg:: /auto_examples/images/sphx_glr_plot_hmm_sampling_and_decoding_002.png :alt: States compared to generated :srcset: /auto_examples/images/sphx_glr_plot_hmm_sampling_and_decoding_002.png :class: sphx-glr-multi-img * .. image-sg:: /auto_examples/images/sphx_glr_plot_hmm_sampling_and_decoding_003.png :alt: Generated Transition Matrix, Recovered Transition Matrix :srcset: /auto_examples/images/sphx_glr_plot_hmm_sampling_and_decoding_003.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 2.082 seconds) .. _sphx_glr_download_auto_examples_plot_hmm_sampling_and_decoding.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_hmm_sampling_and_decoding.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_hmm_sampling_and_decoding.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_