XMM - Probabilistic Models for Motion Recognition and Mapping

xmmHmmSingleClass.hpp
Go to the documentation of this file.
1 /*
2  * xmmHmmSingleClass.hpp
3  *
4  * Hidden Markov Model Definition for a Single Class
5  *
6  * Contact:
7  * - Jules Francoise <jules.francoise@ircam.fr>
8  *
9  * This code has been initially authored by Jules Francoise
10  * <http://julesfrancoise.com> during his PhD thesis, supervised by Frederic
11  * Bevilacqua <href="http://frederic-bevilacqua.net>, in the Sound Music
12  * Movement Interaction team <http://ismm.ircam.fr> of the
13  * STMS Lab - IRCAM, CNRS, UPMC (2011-2015).
14  *
15  * Copyright (C) 2015 UPMC, Ircam-Centre Pompidou.
16  *
17  * This File is part of XMM.
18  *
19  * XMM is free software: you can redistribute it and/or modify
20  * it under the terms of the GNU General Public License as published by
21  * the Free Software Foundation, either version 3 of the License, or
22  * (at your option) any later version.
23  *
24  * XMM is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with XMM. If not, see <http://www.gnu.org/licenses/>.
31  */
32 
33 #ifndef xmmHmmSingleClass_hpp
34 #define xmmHmmSingleClass_hpp
35 
36 #include "../gmm/xmmGmmSingleClass.hpp"
37 #include "xmmHmmParameters.hpp"
38 #include "xmmHmmResults.hpp"
39 
40 namespace xmm {
48  template <typename SingleClassModel, typename ModelType>
49  friend class Model;
50  friend class HierarchicalHMM;
51 
52  public:
53  static const float DEFAULT_EXITPROBABILITY_LAST_STATE() { return 0.1; }
54  static const float TRANSITION_REGULARIZATION() { return 1.0e-5; }
55 
60  SingleClassHMM(std::shared_ptr<SharedParameters> p = NULL);
61 
66  SingleClassHMM(SingleClassHMM const& src);
67 
73  explicit SingleClassHMM(std::shared_ptr<SharedParameters> p,
74  Json::Value const& root);
75 
81 
83 
93  void addExitPoint(int stateIndex, float proba);
94 
96 
98 
103  void reset();
104 
112  double filter(std::vector<float> const& observation);
113 
115 
117 
123  virtual Json::Value toJson() const;
124 
130  virtual void fromJson(Json::Value const& root);
131 
133 
134  // /**
135  // @brief Convert to bimodal HMM in place
136  // @param dimension_input dimension of the input modality
137  // @throws runtime_error if the model is already bimodal
138  // @throws out_of_range if the requested input dimension is too
139  // large
140  // */
141  // void makeBimodal(unsigned int dimension_input);
142  //
143  // /**
144  // @brief Convert to unimodal HMM in place
145  // @throws runtime_error if the model is already unimodal
146  // */
147  // void makeUnimodal();
148  //
149  // /**
150  // @brief extract a submodel with the given columns
151  // @param columns columns indices in the target order
152  // @throws runtime_error if the model is training
153  // @throws out_of_range if the number or indices of the requested
154  // columns exceeds the current dimension
155  // @return a HMM from the current model considering only the target
156  // columns
157  // */
158  // HMM extractSubmodel(std::vector<unsigned int>& columns) const;
159  //
160  // /**
161  // @brief extract the submodel of the input modality
162  // @throws runtime_error if the model is training or if it is not
163  // bimodal
164  // @return a unimodal HMM of the input modality from the current
165  // bimodal model
166  // */
167  // HMM extractSubmodel_input() const;
168  //
169  // /**
170  // @brief extract the submodel of the output modality
171  // @throws runtime_error if the model is training or if it is not
172  // bimodal
173  // @return a unimodal HMM of the output modality from the current
174  // bimodal model
175  // */
176  // HMM extractSubmodel_output() const;
177  //
178  // /**
179  // @brief extract the model with reversed input and output
180  // modalities
181  // @throws runtime_error if the model is training or if it is not
182  // bimodal
183  // @return a bimodal HMM that swaps the input and output modalities
184  // */
185  // HMM extract_inverse_model() const;
186 
191 
196 
200  std::vector<double> alpha;
201 
207  std::vector<double> alpha_h[3];
208 
212  std::vector<SingleClassGMM> states;
213 
217  std::vector<float> prior;
218 
222  std::vector<float> transition;
223 
224  protected:
228  void allocate();
229 
233  void initParametersToDefault(std::vector<float> const& dataStddev);
234 
239  void initMeansWithAllPhrases(TrainingSet* trainingSet);
240 
245  void initCovariances_fullyObserved(TrainingSet* trainingSet);
246 
251  void initMeansCovariancesWithGMMEM(TrainingSet* trainingSet);
252 
256  void setErgodic();
257 
261  void setLeftRight();
262 
266  void normalizeTransitions();
267 
278  double forward_init(const float* observation,
279  const float* observation_output = NULL);
280 
291  double forward_update(const float* observation,
292  const float* observation_output = NULL);
293 
299  void backward_init(double ct);
300 
312  void backward_update(double ct, const float* observation,
313  const float* observation_output = NULL);
314 
318  void emAlgorithmInit(TrainingSet* trainingSet);
319 
323  void emAlgorithmTerminate();
324 
328  virtual double emAlgorithmUpdate(TrainingSet* trainingSet);
329 
337  double baumWelch_forwardBackward(std::shared_ptr<Phrase> currentPhrase,
338  int phraseIndex);
339 
348  std::vector<double>::iterator observation_likelihoods);
349 
359  double ct, std::vector<double>::iterator observation_likelihoods);
360 
364  void baumWelch_gammaSum(TrainingSet* trainingSet);
365 
370 
374  void baumWelch_estimateMeans(TrainingSet* trainingSet);
375 
379  void baumWelch_estimateCovariances(TrainingSet* trainingSet);
380 
384  void baumWelch_estimatePrior(TrainingSet* trainingSet);
385 
389  void baumWelch_estimateTransitions(TrainingSet* trainingSet);
390 
398  void addCyclicTransition(double proba);
399 
407  void updateAlphaWindow();
408 
415  void regression(std::vector<float> const& observation_input);
416 
423  void updateResults();
424 
435  void updateExitProbabilities(float* _exitProbabilities = NULL);
436 
437  protected:
442 
446  std::vector<double> previous_alpha_;
447 
451  std::vector<double> beta_;
452 
456  std::vector<double> previous_beta_;
457 
461  std::vector<std::vector<double> > gamma_sequence_;
462 
466  std::vector<std::vector<double> > epsilon_sequence_;
467 
471  std::vector<std::vector<std::vector<double> > > gamma_sequence_per_mixture_;
472 
476  std::vector<double> alpha_seq_;
477 
481  std::vector<double> beta_seq_;
482 
486  std::vector<double> gamma_sum_;
487 
492  std::vector<double> gamma_sum_per_mixture_;
493 
501 
505  std::vector<float> exit_probabilities_;
506 
512 
518 
524 };
525 }
526 
527 #endif
static const float TRANSITION_REGULARIZATION()
Definition: xmmHmmSingleClass.hpp:54
void updateExitProbabilities(float *_exitProbabilities=NULL)
Update the exit probability vector given the probabilities.
Definition: xmmHmmSingleClass.cpp:1350
std::vector< double > beta_seq_
Sequence of beta (backward) probabilities.
Definition: xmmHmmSingleClass.hpp:481
void addExitPoint(int stateIndex, float proba)
Set the exit probability of a specific state.
Definition: xmmHmmSingleClass.cpp:1371
void setErgodic()
set the prior and transition matrix to ergodic
Definition: xmmHmmSingleClass.cpp:293
SingleClassHMM & operator=(SingleClassHMM const &src)
Assignment.
Definition: xmmHmmSingleClass.cpp:78
void updateAlphaWindow()
Estimates the likeliest state and compute the bounds of the windows over the states.
Definition: xmmHmmSingleClass.cpp:1158
static const float DEFAULT_EXITPROBABILITY_LAST_STATE()
Definition: xmmHmmSingleClass.hpp:53
void emAlgorithmTerminate()
Termination of the training algorithm.
Definition: xmmHmmSingleClass.cpp:541
int window_maxindex_
minimum index of the alpha window (used for regression & time progression)
Definition: xmmHmmSingleClass.hpp:517
std::vector< double > gamma_sum_per_mixture_
Used to store the sums of the gamma variable for each mixture component.
Definition: xmmHmmSingleClass.hpp:492
void initMeansCovariancesWithGMMEM(TrainingSet *trainingSet)
initialize the means and covariances of each state using GMM-EM on segments.
Definition: xmmHmmSingleClass.cpp:250
void baumWelch_estimateCovariances(TrainingSet *trainingSet)
Estimate the Covariances of the Gaussian Distribution for each state.
Definition: xmmHmmSingleClass.cpp:899
std::vector< double > previous_beta_
used to store the beta estimated at the previous time step
Definition: xmmHmmSingleClass.hpp:456
void baumWelch_estimateMeans(TrainingSet *trainingSet)
Estimate the Means of the Gaussian Distribution for each state.
Definition: xmmHmmSingleClass.cpp:852
Probabilistic machine learning model for multiclass recognition and regression.
Definition: xmmModel.hpp:52
void baumWelch_estimatePrior(TrainingSet *trainingSet)
Estimate the Prior Probabilities.
Definition: xmmHmmSingleClass.cpp:973
Parameters specific to each class of a Hidden Markov Model.
Definition: xmmHmmParameters.hpp:92
std::vector< double > alpha_h[3]
State probabilities estimated by the hierarchical forward algorithm.
Definition: xmmHmmSingleClass.hpp:207
std::vector< double > beta_
backward state probabilities
Definition: xmmHmmSingleClass.hpp:451
ClassResults< HMM > results
Results of the filtering process (recognition & regression)
Definition: xmmHmmSingleClass.hpp:195
Results of Hidden Markov Models for a single class.
Definition: xmmHmmResults.hpp:44
double forward_init(const float *observation, const float *observation_output=NULL)
Initialization of the forward algorithm.
Definition: xmmHmmSingleClass.cpp:338
std::vector< SingleClassGMM > states
States of the model (Gaussian Mixture Models)
Definition: xmmHmmSingleClass.hpp:212
std::vector< float > transition
Transition Matrix.
Definition: xmmHmmSingleClass.hpp:222
bool is_hierarchical_
Defines if the model is a submodel of a hierarchical HMM.
Definition: xmmHmmSingleClass.hpp:500
void backward_update(double ct, const float *observation, const float *observation_output=NULL)
Update of the Backward algorithm.
Definition: xmmHmmSingleClass.cpp:430
std::vector< double > gamma_sum_
Used to store the sums of the gamma variable.
Definition: xmmHmmSingleClass.hpp:486
void setLeftRight()
set the prior and transition matrix to left-right (no state skip)
Definition: xmmHmmSingleClass.cpp:304
ClassParameters< HMM > parameters
Convert to bimodal HMM in place.
Definition: xmmHmmSingleClass.hpp:190
std::vector< float > exit_probabilities_
Exit probabilities for a hierarchical model.
Definition: xmmHmmSingleClass.hpp:505
void reset()
Resets the fitering process (recognition or regression)
Definition: xmmHmmSingleClass.cpp:1094
void addCyclicTransition(double proba)
Adds a cyclic Transition probability (from last state to first state)
Definition: xmmHmmSingleClass.cpp:1110
virtual void fromJson(Json::Value const &root)
Read the object from a JSON Structure.
Definition: xmmHmmSingleClass.cpp:1337
void normalizeTransitions()
Normalize transition probabilities.
Definition: xmmHmmSingleClass.cpp:312
Single-Class Hidden Markov Model.
Definition: xmmHmmSingleClass.hpp:47
double baumWelch_forward_update(std::vector< double >::iterator observation_likelihoods)
Update of the forward algorithm for Training (observation probabilities are pre-computed) ...
Definition: xmmHmmSingleClass.cpp:597
double forward_update(const float *observation, const float *observation_output=NULL)
Update of the forward algorithm.
Definition: xmmHmmSingleClass.cpp:383
double window_normalization_constant_
normalization constant of the alpha window (used for regression & time progression) ...
Definition: xmmHmmSingleClass.hpp:523
std::vector< std::vector< double > > gamma_sequence_
Sequence of Gamma probabilities.
Definition: xmmHmmSingleClass.hpp:461
Generic Template for Machine Learning Probabilistic models based on the EM algorithm.
Definition: xmmModelSingleClass.hpp:174
std::vector< double > alpha_seq_
Sequence of alpha (forward) probabilities.
Definition: xmmHmmSingleClass.hpp:476
int window_minindex_
minimum index of the alpha window (used for regression & time progression)
Definition: xmmHmmSingleClass.hpp:511
void backward_init(double ct)
Initialization Backward algorithm.
Definition: xmmHmmSingleClass.cpp:426
void baumWelch_gammaSum(TrainingSet *trainingSet)
Compute the sum of the gamma variable (for use in EM)
Definition: xmmHmmSingleClass.cpp:797
Base class for the definition of training sets.
Definition: xmmTrainingSet.hpp:46
void initParametersToDefault(std::vector< float > const &dataStddev)
initialize model parameters to their default values
Definition: xmmHmmSingleClass.cpp:127
SingleClassHMM(std::shared_ptr< SharedParameters > p=NULL)
Constructor.
Definition: xmmHmmSingleClass.cpp:35
void emAlgorithmInit(TrainingSet *trainingSet)
Initialization of the parameters before training.
Definition: xmmHmmSingleClass.cpp:494
std::vector< std::vector< std::vector< double > > > gamma_sequence_per_mixture_
Sequence of Gamma probabilities for each mixture component.
Definition: xmmHmmSingleClass.hpp:471
virtual Json::Value toJson() const
Write the object to a JSON Structure.
Definition: xmmHmmSingleClass.cpp:1320
bool forward_initialized_
Defines if the forward algorithm has been initialized.
Definition: xmmHmmSingleClass.hpp:441
std::vector< double > previous_alpha_
used to store the alpha estimated at the previous time step
Definition: xmmHmmSingleClass.hpp:446
virtual double emAlgorithmUpdate(TrainingSet *trainingSet)
update method of the EM algorithm (calls Baum-Welch Algorithm)
Definition: xmmHmmSingleClass.cpp:553
Hierarchical Hidden Markov Model for Continuous Recognition and Regression (Multi-class) ...
Definition: xmmHierarchicalHmm.hpp:47
std::vector< float > prior
Prior probabilities.
Definition: xmmHmmSingleClass.hpp:217
Definition: xmmAttribute.hpp:42
std::vector< std::vector< double > > epsilon_sequence_
Sequence of Epsilon probabilities.
Definition: xmmHmmSingleClass.hpp:466
std::vector< double > alpha
State probabilities estimated by the forward algorithm.
Definition: xmmHmmSingleClass.hpp:200
void updateResults()
update the content of the likelihood buffer and return average likelihood.
Definition: xmmHmmSingleClass.cpp:1285
double baumWelch_forwardBackward(std::shared_ptr< Phrase > currentPhrase, int phraseIndex)
Compute the forward-backward algorithm on a phrase of the training set.
Definition: xmmHmmSingleClass.cpp:659
void baumWelch_estimateMixtureCoefficients(TrainingSet *trainingSet)
Estimate the Coefficients of the Gaussian Mixture for each state.
Definition: xmmHmmSingleClass.cpp:827
void allocate()
Allocate model parameters.
Definition: xmmHmmSingleClass.cpp:99
void initMeansWithAllPhrases(TrainingSet *trainingSet)
initialize the means of each state with all training phrases (single gaussian)
Definition: xmmHmmSingleClass.cpp:139
void initCovariances_fullyObserved(TrainingSet *trainingSet)
initialize the covariances of each state with all training phrases (single gaussian) ...
Definition: xmmHmmSingleClass.cpp:170
void baumWelch_backward_update(double ct, std::vector< double >::iterator observation_likelihoods)
Update of the Backward algorithm for Training (observation probabilities are pre-computed) ...
Definition: xmmHmmSingleClass.cpp:632
void regression(std::vector< float > const &observation_input)
Compute the regression for the case of a bimodal model, given the estimated state probabilities estim...
Definition: xmmHmmSingleClass.cpp:1196
double filter(std::vector< float > const &observation)
filters a incoming observation (performs recognition or regression)
Definition: xmmHmmSingleClass.cpp:1121
void baumWelch_estimateTransitions(TrainingSet *trainingSet)
Estimate the Transition Probabilities.
Definition: xmmHmmSingleClass.cpp:998