Rapid-Mix API  v2.2.0
A simple library for machine learning & signal processing
rapidXMM.h
Go to the documentation of this file.
1 
12 #ifndef _RAPID_XMM_TOOLS_H_
13 #define _RAPID_XMM_TOOLS_H_
14 
15 // this works !
16 #ifndef EXTERNAL_JSONCPP_PATH
17 // #define EXTERNAL_JSONCPP_PATH "../../../../json/json.h" // relative to xmmJson.h
18 #define EXTERNAL_JSONCPP_PATH "json.h"
19 #endif /* EXTERNAL_JSONCPP_PATH */
20 
21 #include "xmm.h"
22 
23 // forward declaration
24 namespace rapidmix { class trainingData; }
25 
26 // original defined in xmmModelConfiguration.hpp
30 };
31 
32 // original defined in xmmGaussianDistribution.hpp
36 };
37 
38 // original defined in xmmHmmParameters.hpp
42 };
43 
44 // original defined in xmmHmmParameters.hpp
49 };
50 
51 // this is the optional argument of machineLearning<xmmWhateverTool>'s constructors
52 struct xmmToolConfig {
54  gaussians(1),
55  relativeRegularization(0.01),
56  absoluteRegularization(0.01),
57  regressionEstimator(xmmMixtureRegression),
58  covarianceMode(xmmFullCovariance),
59  states(5),
60  hierarchical(true),
61  hmmTransitionMode(xmmHmmErgodicTransition),
62  hmmRegressionEstimator(xmmHmmFullRegression),
63  likelihoodWindow(5) {}
64 
65  // general parameters :
66  uint32_t gaussians;
71 
72  // hmm specific :
73  uint32_t states;
77 
78  // run-time parameter :
79  uint32_t likelihoodWindow;
80 };
81 
82 //========================== template base class =============================//
83 
84 template <class SingleClassModel, class Model>
85 class xmmTool {
86 protected:
87  xmmTool(bool bimodal) {
88  model = Model(bimodal);
89  model.configuration.multithreading = xmm::MultithreadingMode::Sequential;
90  model.configuration.changed = true;
91 
92  set = xmm::TrainingSet(xmm::MemoryMode::OwnMemory,
93  bimodal
94  ? xmm::Multimodality::Bimodal
95  : xmm::Multimodality::Unimodal
96  );
97  }
98 
99  virtual void preProcess(const std::vector<double> &inputVector) {
100  std::vector<float> fv(inputVector.begin(), inputVector.end());
101  model.filter(fv);
102  }
103 
104 public:
105  virtual ~xmmTool() {}
106 
107  virtual bool train(const rapidmix::trainingData &newTrainingData);
108 
109  virtual bool reset() {
110  model.reset();
111  return true;
112  }
113 
115  virtual std::string getJSON();
117  virtual void writeJSON(const std::string &filepath);
119  virtual bool putJSON(const std::string &jsonMessage);
121  virtual bool readJSON(const std::string &filepath);
122 
123 protected:
124  Model model;
125  xmm::TrainingSet set;
126 
127  Json::Value toJSON();
128  bool fromJSON(Json::Value &jm);
129 };
130 
131 //======================= base class for GMM models ==========================//
132 
133 template <class SingleClassModel, class Model>
134 class xmmStaticTool : public xmmTool<SingleClassModel, Model> {
135 protected:
136  xmmStaticTool(xmmToolConfig cfg, bool bimodal) :
137  xmmTool<SingleClassModel, Model>(bimodal) {
138  xmm::Configuration<SingleClassModel>& mCfg = this->model.configuration;
139 
140  mCfg.gaussians.set(cfg.gaussians);
141  mCfg.relative_regularization.set(cfg.relativeRegularization);
142  mCfg.absolute_regularization.set(cfg.absoluteRegularization);
143 
144  xmm::MultiClassRegressionEstimator mcre;
145  switch (cfg.regressionEstimator) {
147  mcre = xmm::MultiClassRegressionEstimator::Likeliest;
149  default:
150  mcre = xmm::MultiClassRegressionEstimator::Mixture;
151  break;
152  }
153  mCfg.multiClass_regression_estimator = mcre;
154 
155  xmm::GaussianDistribution::CovarianceMode gdcm;
156  switch (cfg.covarianceMode) {
157  case xmmFullCovariance:
158  gdcm = xmm::GaussianDistribution::CovarianceMode::Full;
159  break;
161  default:
162  gdcm = xmm::GaussianDistribution::CovarianceMode::Diagonal;
163  break;
164  }
165  mCfg.covariance_mode.set(gdcm);
166 
167  mCfg.changed = true;
168 
169  this->model.shared_parameters->likelihood_window.set(cfg.likelihoodWindow);
170  }
171 
172 public:
173  virtual ~xmmStaticTool() {}
174 };
175 
176 //======================= base class for HMM models ==========================//
177 
178 template <class SingleClassModel, class Model>
179 class xmmTemporalTool : public xmmStaticTool<SingleClassModel, Model> {
180 protected:
181  xmmTemporalTool(xmmToolConfig cfg, bool bimodal) :
182  xmmStaticTool<SingleClassModel, Model>(cfg, bimodal) {
183  xmm::Configuration<SingleClassModel>& mCfg = this->model.configuration;
184 
185  mCfg.states.set(cfg.states);
186  mCfg.hierarchical.set(cfg.hierarchical);
187 
188  xmm::HMM::TransitionMode htm;
189  switch (cfg.hmmTransitionMode) {
191  htm = xmm::HMM::TransitionMode::LeftRight;
192  break;
194  default:
195  htm = xmm::HMM::TransitionMode::Ergodic;
196  break;
197  }
198  mCfg.transition_mode.set(htm);
199 
200  xmm::HMM::RegressionEstimator hre;
201  switch (cfg.hmmRegressionEstimator) {
203  hre = xmm::HMM::RegressionEstimator::Full;
204  break;
206  hre = xmm::HMM::RegressionEstimator::Windowed;
207  break;
209  default:
210  hre = xmm::HMM::RegressionEstimator::Likeliest;
211  break;
212  }
213  mCfg.regression_estimator.set(hre);
214 
215  mCfg.changed = true;
216  }
217 
218 public:
219  virtual ~xmmTemporalTool() {}
220 };
221 
222 //================== actual classes used in machineLearning.h ================//
223 
227 // class xmmGmmTool : public xmmStaticTool<xmm::GMM, xmm::GMM> {
228 // class GMM : public xmmStaticTool<xmm::GMM, xmm::GMM> {
229 class rapidXmmGmm : public xmmStaticTool<xmm::GMM, xmm::GMM> {
230 public:
231  // xmmGmmTool(xmmToolConfig cfg = xmmToolConfig()) :
232  // GMM(xmmToolConfig cfg = xmmToolConfig()) :
234  xmmStaticTool<xmm::GMM, xmm::GMM>(cfg, false) {}
235  // ~xmmGmmTool() {}
236  // ~GMM() {}
238 
239  std::vector<double> run(const std::vector<double>& inputVector);
240 };
241 
245 // class xmmGmrTool : public xmmStaticTool<xmm::GMM, xmm::GMM> {
246 // class GMR : public xmmStaticTool<xmm::GMM, xmm::GMM> {
247 class rapidXmmGmr : public xmmStaticTool<xmm::GMM, xmm::GMM> {
248 public:
249  // xmmGmrTool(xmmToolConfig cfg = xmmToolConfig()) :
250  // GMR(xmmToolConfig cfg = xmmToolConfig()) :
252  xmmStaticTool<xmm::GMM, xmm::GMM>(cfg, true) {}
253  // ~xmmGmrTool() {}
254  // ~GMR() {}
256 
257  std::vector<double> run(const std::vector<double>& inputVector);
258 };
259 
263 // class xmmHmmTool : public xmmTemporalTool<xmm::HMM, xmm::HierarchicalHMM> {
264 // class HMM : public xmmTemporalTool<xmm::HMM, xmm::HierarchicalHMM> {
265 class rapidXmmHmm : public xmmTemporalTool<xmm::HMM, xmm::HierarchicalHMM> {
266 public:
267  // xmmHmmTool(xmmToolConfig cfg = xmmToolConfig()) :
268  // HMM(xmmToolConfig cfg = xmmToolConfig()) :
270  xmmTemporalTool<xmm::HMM, xmm::HierarchicalHMM>(cfg, false) {}
271  // ~xmmHmmTool() {}
272  // ~HMM() {}
274 
275  std::vector<double> run(const std::vector<double>& inputVector);
276 };
277 
281 // class xmmHmrTool : public xmmTemporalTool<xmm::HMM, xmm::HierarchicalHMM> {
282 // class HMR : public xmmTemporalTool<xmm::HMM, xmm::HierarchicalHMM> {
283 class rapidXmmHmr : public xmmTemporalTool<xmm::HMM, xmm::HierarchicalHMM> {
284 public:
285  // xmmHmrTool(xmmToolConfig cfg = xmmToolConfig()) :
286  // HMR(xmmToolConfig cfg = xmmToolConfig()) :
288  xmmTemporalTool<xmm::HMM, xmm::HierarchicalHMM>(cfg, true) {}
289  // ~xmmHmrTool() {}
290  // ~HMR() {}
292 
293  std::vector<double> run(const std::vector<double>& inputVector);
294 };
295 
296 #endif /* _RAPID_XMM_TOOLS_H_ */
~rapidXmmGmr()
Definition: rapidXMM.h:255
xmmHmmRegressionEstimator
Definition: rapidXMM.h:45
virtual ~xmmTool()
Definition: rapidXMM.h:105
Definition: rapidXMM.h:35
rapidXmmGmr(xmmToolConfig cfg=xmmToolConfig())
Definition: rapidXMM.h:251
uint32_t gaussians
Definition: rapidXMM.h:66
Definition: rapidXMM.h:41
Definition: rapidXMM.h:40
Definition: rapidXMM.h:34
xmmHmmTransitionMode hmmTransitionMode
Definition: rapidXMM.h:75
virtual ~xmmTemporalTool()
Definition: rapidXMM.h:219
xmmTemporalTool(xmmToolConfig cfg, bool bimodal)
Definition: rapidXMM.h:181
Temporal regression using Hierarchical Hidden Markov Models.
Definition: rapidXMM.h:283
Static regression using Gaussian Mixture Models.
Definition: rapidXMM.h:247
Definition: rapidXMM.h:52
xmmRegressionEstimator
Definition: rapidXMM.h:27
Definition: machineLearning.cpp:11
Definition: rapidXMM.h:179
Model model
Definition: rapidXMM.h:124
xmmToolConfig()
Definition: rapidXMM.h:53
rapidXmmHmm(xmmToolConfig cfg=xmmToolConfig())
Definition: rapidXMM.h:269
Definition: rapidXMM.h:28
Definition: rapidXMM.h:85
~rapidXmmGmm()
Definition: rapidXMM.h:237
xmmCovarianceMode covarianceMode
Definition: rapidXMM.h:70
virtual void preProcess(const std::vector< double > &inputVector)
Definition: rapidXMM.h:99
rapidXmmHmr(xmmToolConfig cfg=xmmToolConfig())
Definition: rapidXMM.h:287
Static classification using Gaussian Mixture Models.
Definition: rapidXMM.h:229
Temporal classification using Hierarchical Hidden Markov Models.
Definition: rapidXMM.h:265
virtual bool reset()
Definition: rapidXMM.h:109
float relativeRegularization
Definition: rapidXMM.h:67
Definition: trainingData.h:24
Definition: rapidXMM.h:46
float absoluteRegularization
Definition: rapidXMM.h:68
uint32_t states
Definition: rapidXMM.h:73
Definition: rapidXMM.h:134
virtual ~xmmStaticTool()
Definition: rapidXMM.h:173
xmmStaticTool(xmmToolConfig cfg, bool bimodal)
Definition: rapidXMM.h:136
xmmHmmRegressionEstimator hmmRegressionEstimator
Definition: rapidXMM.h:76
xmmRegressionEstimator regressionEstimator
Definition: rapidXMM.h:69
Definition: rapidXMM.h:48
Definition: rapidXMM.h:47
uint32_t likelihoodWindow
Definition: rapidXMM.h:79
xmmHmmTransitionMode
Definition: rapidXMM.h:39
bool hierarchical
Definition: rapidXMM.h:74
rapidXmmGmm(xmmToolConfig cfg=xmmToolConfig())
Definition: rapidXMM.h:233
xmm::TrainingSet set
Definition: rapidXMM.h:125
xmmTool(bool bimodal)
Definition: rapidXMM.h:87
~rapidXmmHmm()
Definition: rapidXMM.h:273
Definition: rapidXMM.h:29
~rapidXmmHmr()
Definition: rapidXMM.h:291
xmmCovarianceMode
Definition: rapidXMM.h:33