XMM - Probabilistic Models for Motion Recognition and Mapping

xmmGmmSingleClass.hpp
Go to the documentation of this file.
1 /*
2  * xmmGmmSingleClass.hpp
3  *
4  * Gaussian Mixture 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 xmmGmmSingleClass_hpp
34 #define xmmGmmSingleClass_hpp
35 
36 #include "../../core/model/xmmModelResults.hpp"
37 #include "../../core/model/xmmModelSingleClass.hpp"
38 #include "xmmGmmParameters.hpp"
39 #include <memory>
40 
41 namespace xmm {
42 const std::vector<float> null_vector_float;
43 
53  public:
54  template <typename SingleClassModel, typename ModelType>
55  friend class Model;
56  friend class SingleClassHMM;
57  friend class HierarchicalHMM;
58 
63  SingleClassGMM(std::shared_ptr<SharedParameters> p = NULL);
64 
69  SingleClassGMM(SingleClassGMM const& src);
70 
76  explicit SingleClassGMM(std::shared_ptr<SharedParameters> p,
77  Json::Value const& root);
78 
84 
86 
91  void reset();
92 
100  double filter(std::vector<float> const& observation);
101 
103 
105 
111  Json::Value toJson() const;
112 
118  void fromJson(Json::Value const& root);
119 
121 
122  //
123  // /**
124  // @brief Convert to bimodal GMM in place
125  // @param dimension_input dimension of the input modality
126  // @throws runtime_error if the model is already bimodal
127  // @throws out_of_range if the requested input dimension is too
128  // large
129  // */
130  // void makeBimodal(unsigned int dimension_input);
131  //
132  // /**
133  // @brief Convert to unimodal GMM in place
134  // @throws runtime_error if the model is already unimodal
135  // */
136  // void makeUnimodal();
137  //
138  // /**
139  // @brief extract a submodel with the given columns
140  // @param columns columns indices in the target order
141  // @throws runtime_error if the model is training
142  // @throws out_of_range if the number or indices of the requested
143  // columns exceeds the current dimension
144  // @return a GMM from the current model considering only the target
145  // columns
146  // */
147  // GMM extractSubmodel(std::vector<unsigned int>& columns) const;
148  //
149  // /**
150  // @brief extract the submodel of the input modality
151  // @throws runtime_error if the model is training or if it is not
152  // bimodal
153  // @return a unimodal GMM of the input modality from the current
154  // bimodal model
155  // */
156  // GMM extractSubmodel_input() const;
157  //
158  // /**
159  // @brief extract the submodel of the output modality
160  // @throws runtime_error if the model is training or if it is not
161  // bimodal
162  // @return a unimodal GMM of the output modality from the current
163  // bimodal model
164  // */
165  // GMM extractSubmodel_output() const;
166  //
167  // /**
168  // @brief extract the model with reversed input and output
169  // modalities
170  // @throws runtime_error if the model is training or if it is not
171  // bimodal
172  // @return a bimodal GMM that swaps the input and output modalities
173  // */
174  // GMM extract_inverse_model() const;
175 
180 
185 
189  std::vector<GaussianDistribution> components;
190 
194  std::vector<float> mixture_coeffs;
195 
199  std::vector<double> beta;
200 
201  protected:
205  void allocate();
206 
218  double obsProb(const float* observation, int mixtureComponent = -1) const;
219 
232  double obsProb_input(const float* observation_input,
233  int mixtureComponent = -1) const;
234 
248  double obsProb_bimodal(const float* observation_input,
249  const float* observation_output,
250  int mixtureComponent = -1) const;
251 
257  void emAlgorithmInit(TrainingSet* trainingSet);
258 
263  double emAlgorithmUpdate(TrainingSet* trainingSet);
264 
269  void initParametersToDefault(std::vector<float> const& dataStddev);
270 
275  void initMeansWithKMeans(TrainingSet* trainingSet);
276 
281  void initCovariances_fullyObserved(TrainingSet* trainingSet);
282 
286  void normalizeMixtureCoeffs();
287 
292  void addCovarianceOffset();
293 
299 
310  double likelihood(
311  std::vector<float> const& observation,
312  std::vector<float> const& observation_output = null_vector_float);
313 
323  void regression(std::vector<float> const& observation_input);
324 
331  void updateResults();
332 
339  std::vector<double> current_regularization;
340 };
341 }
342 
343 #endif
double emAlgorithmUpdate(TrainingSet *trainingSet)
Update Function of the EM algorithm.
Definition: xmmGmmSingleClass.cpp:389
const std::vector< float > null_vector_float
Definition: xmmGmmSingleClass.hpp:42
std::vector< float > mixture_coeffs
Mixture Coefficients.
Definition: xmmGmmSingleClass.hpp:194
Json::Value toJson() const
Write the object to a JSON Structure.
Definition: xmmGmmSingleClass.cpp:95
std::vector< double > beta
Beta probabilities: likelihood of each component.
Definition: xmmGmmSingleClass.hpp:199
double filter(std::vector< float > const &observation)
filters a incoming observation (performs recognition or regression)
Definition: xmmGmmSingleClass.cpp:78
Parameters specific to each class of a Gaussian Mixture Model.
Definition: xmmGmmParameters.hpp:54
double obsProb_bimodal(const float *observation_input, const float *observation_output, int mixtureComponent=-1) const
Observation probability for bimodal mode.
Definition: xmmGmmSingleClass.cpp:276
void updateInverseCovariances()
Update inverse covariances of each Gaussian component.
Definition: xmmGmmSingleClass.cpp:562
double likelihood(std::vector< float > const &observation, std::vector< float > const &observation_output=null_vector_float)
Compute likelihood and estimate components probabilities.
Definition: xmmGmmSingleClass.cpp:606
Probabilistic machine learning model for multiclass recognition and regression.
Definition: xmmModel.hpp:52
SingleClassGMM & operator=(SingleClassGMM const &src)
Assignment.
Definition: xmmGmmSingleClass.cpp:65
ClassResults< GMM > results
Results of the filtering process (recognition & regression)
Definition: xmmGmmSingleClass.hpp:184
void allocate()
Allocate model parameters.
Definition: xmmGmmSingleClass.cpp:223
void regression(std::vector< float > const &observation_input)
Compute Gaussian Mixture Regression.
Definition: xmmGmmSingleClass.cpp:573
Single-Class Hidden Markov Model.
Definition: xmmHmmSingleClass.hpp:47
std::vector< double > current_regularization
vector containing the regularization values over each dimension
Definition: xmmGmmSingleClass.hpp:339
void emAlgorithmInit(TrainingSet *trainingSet)
Initialize the EM Training Algorithm.
Definition: xmmGmmSingleClass.cpp:87
ClassParameters< GMM > parameters
Convert to bimodal GMM in place.
Definition: xmmGmmSingleClass.hpp:179
Generic Template for Machine Learning Probabilistic models based on the EM algorithm.
Definition: xmmModelSingleClass.hpp:174
SingleClassGMM(std::shared_ptr< SharedParameters > p=NULL)
Constructor.
Definition: xmmGmmSingleClass.cpp:36
void normalizeMixtureCoeffs()
Normalize mixture coefficients.
Definition: xmmGmmSingleClass.cpp:540
Base class for the definition of training sets.
Definition: xmmTrainingSet.hpp:46
Class-specific Results of the filtering/inference process.
Definition: xmmModelResults.hpp:47
void initParametersToDefault(std::vector< float > const &dataStddev)
Initialize model parameters to default values.
Definition: xmmGmmSingleClass.cpp:511
void fromJson(Json::Value const &root)
Read the object from a JSON Structure.
Definition: xmmGmmSingleClass.cpp:108
double obsProb_input(const float *observation_input, int mixtureComponent=-1) const
Observation probability on the input modality.
Definition: xmmGmmSingleClass.cpp:255
Hierarchical Hidden Markov Model for Continuous Recognition and Regression (Multi-class) ...
Definition: xmmHierarchicalHmm.hpp:47
Definition: xmmAttribute.hpp:42
void reset()
Resets the fitering process (recognition or regression)
Definition: xmmGmmSingleClass.cpp:76
Single-Class Gaussian Mixture Model.
Definition: xmmGmmSingleClass.hpp:52
void addCovarianceOffset()
Add offset to the diagonal of the covariance matrices.
Definition: xmmGmmSingleClass.cpp:556
void initCovariances_fullyObserved(TrainingSet *trainingSet)
Initialize the Covariances of the Gaussian components using a fully observed approximation.
Definition: xmmGmmSingleClass.cpp:314
double obsProb(const float *observation, int mixtureComponent=-1) const
Observation probability.
Definition: xmmGmmSingleClass.cpp:234
void initMeansWithKMeans(TrainingSet *trainingSet)
Initialize the means of the Gaussian components with a Biased K-means.
Definition: xmmGmmSingleClass.cpp:300
std::vector< GaussianDistribution > components
Vector of Gaussian Components.
Definition: xmmGmmSingleClass.hpp:189
void updateResults()
update the content of the likelihood buffer and return average likelihood.
Definition: xmmGmmSingleClass.cpp:632