Gaussians.cpp
Go to the documentation of this file.
1 /*
2  * Gaussians.cpp
3  *
4  * Created on: Nov 19, 2011
5  * Author: Seungsu KIM
6  */
7 
8 #include "Gaussians.h"
9 
10 #include <math.h>
11 
12 #include <fstream>
13 #include <iostream>
14 
15 using namespace std;
16 
17 /*
18 Gaussians::Gaussians(GMMs *model)
19 {
20  this->model.nbStates = model->nbStates;
21  this->model.nbDim = model->nbDim;
22 
23  this->model.States = (GMMState *)malloc(model->nbStates*sizeof(GMMState) );
24 
25  for(int s=0; s<model->nbStates; s++ ){
26  this->model.States[s].Mu = model->GMMState[s].Mu;
27  this->model.States[s].Sigma = model->GMMState[s].Sigma;
28  this->model.States[s].Prio = model->GMMState[s].Prio;
29  }
30 }
31 */
32 
33 Gaussians::Gaussians(const char* f_mu, const char* f_sigma, const char* f_prio)
34 {
35  int s, i, j;
36  int nbStates;
37  int nbDim;
38 
39  MathLib::Matrix fMatrix;
40  fMatrix.Load(f_prio);
41  if (fMatrix(0, fMatrix.ColumnSize() - 1) > 0.0)
42  {
43  nbStates = fMatrix.ColumnSize();
44  }
45  else
46  {
47  nbStates = fMatrix.ColumnSize() - 1;
48  }
49 
50  for (s = 0; s < nbStates; s++)
51  {
52  model.States[s].Prio = fMatrix(0, s);
53  }
54 
55  fMatrix.Load(f_mu);
56  nbDim = fMatrix.RowSize();
57  model.nbStates = nbStates;
58  model.nbDim = nbDim;
59 
60 
61  for (s = 0; s < nbStates; s++)
62  {
63  model.States[s].Mu.Resize(nbDim);
64  model.States[s].Sigma.Resize(nbDim, nbDim);
65  }
66 
67  for (s = 0; s < nbStates; s++)
68  {
69  model.States[s].Mu = fMatrix.GetColumn(s);
70  }
71 
72  fMatrix.Load(f_sigma);
73  j = 0;
74  for (s = 0; s < nbStates; s++)
75  {
76  for (i = 0; i < nbDim; i++)
77  {
78  model.States[s].Sigma.SetRow(fMatrix.GetRow(j), i);
79  j++;
80  }
81  }
82 }
83 
84 Gaussians::Gaussians(int nbStates,
85  int nbDim,
86  const char* f_mu,
87  const char* f_sigma,
88  const char* f_prio)
89 {
90 
91  int s, i, j;
92 
93  model.nbStates = nbStates;
94  model.nbDim = nbDim;
95 
96  for (s = 0; s < nbStates; s++)
97  {
98  model.States[s].Mu.Resize(nbDim);
99  model.States[s].Sigma.Resize(nbDim, nbDim);
100  }
101 
102  MathLib::Matrix fMatrix(nbDim, nbStates);
103  fMatrix.Load(f_mu);
104  for (s = 0; s < nbStates; s++)
105  {
106  model.States[s].Mu = fMatrix.GetColumn(s);
107  }
108 
109  fMatrix.Resize(nbStates * nbDim, nbDim);
110  fMatrix.Load(f_sigma);
111  j = 0;
112  for (s = 0; s < nbStates; s++)
113  {
114  for (i = 0; i < nbDim; i++)
115  {
116  model.States[s].Sigma.SetRow(fMatrix.GetRow(j), i);
117  j++;
118  }
119  }
120 
121  fMatrix.Resize(1, nbStates);
122  fMatrix.Load(f_prio);
123  MathLib::Vector fVector(nbStates);
124  for (s = 0; s < nbStates; s++)
125  {
126  model.States[s].Prio = fMatrix(0, s);
127  }
128 }
129 
130 Gaussians::Gaussians(const int nbStates,
131  const int nbDim,
132  const vector<double> pri_vec,
133  const vector<double> mu_vec,
134  const vector<double> sig_vec)
135 {
136 
137  model.nbStates = nbStates;
138  model.nbDim = nbDim;
139 
140  for (int s = 0; s < nbStates; s++)
141  {
142  model.States[s].Mu.Resize(nbDim);
143  model.States[s].Sigma.Resize(nbDim, nbDim);
144  }
145 
146  for (int s = 0; s < nbStates; s++)
147  {
148  model.States[s].Prio = pri_vec[s];
149  }
150  // cout << endl << "Printing the constructed Priors" << endl;
151  // for ( int s = 0; s < nbStates; s++ ) {
152  // cout << model.States[s].Prio << "\t";
153  // }
154  // cout << endl;
155 
156 
157  for (int s = 0; s < nbStates; s++)
158  {
159  for (int d = 0; d < nbDim; d++)
160  {
161  model.States[s].Mu[d] = mu_vec[s * nbDim + d];
162  }
163  }
164 
165 
166  // cout << endl << "Printing the constructed Mu" << endl;
167  // for ( int s = 0; s < nbStates; s++ ) {
168  // for (int d = 0; d < nbDim; d++) {
169  // cout << model.States[s].Mu[d] << "\t";
170  // }
171  // cout << endl;
172  // }
173 
174  for (int s = 0; s < nbStates; s++)
175  {
176  for (int row = 0; row < nbDim; row++)
177  {
178  for (int col = 0; col < nbDim; col++)
179  {
180  int ind = s * nbDim * nbDim + row * nbDim + col;
181  model.States[s].Sigma(row, col) = sig_vec[ind];
182  }
183  }
184  }
185 
186 
187  // cout << endl << "Printing the constructed Sigma" << endl;
188  // for ( int s = 0; s < nbStates; s++ ) {
189  // for (int row = 0; row < nbDim; row++) {
190  // for (int col = 0; col < nbDim; col++) {
191  // cout << model.States[s].Sigma(row, col) << "\t";
192  // }
193  // cout <<endl;
194  // }
195  // cout << endl;
196  // }
197 }
198 
199 void
201 {
202  for (unsigned int s = 0; s < model->nbStates; s++)
203  {
204  this->model.States[s].Mu = model->States[s].Mu;
205  this->model.States[s].Sigma = model->States[s].Sigma;
206  this->model.States[s].Prio = model->States[s].Prio;
207  }
208 }
209 
210 void
211 Gaussians::InitFastGaussians(int first_inindex, int last_inindex)
212 {
213  double det;
214  int nbIN = last_inindex - first_inindex + 1;
215 
216  for (unsigned int s = 0; s < model.nbStates; s++)
217  {
218  gmmpinv[s].MuI.Resize(nbIN);
219  gmmpinv[s].SigmaII.Resize(nbIN, nbIN);
220  gmmpinv[s].SigmaIIInv.Resize(nbIN, nbIN);
221  }
222 
223  for (unsigned int s = 0; s < model.nbStates; s++)
224  {
225  for (int i = first_inindex; i <= last_inindex; i++)
226  {
227  gmmpinv[s].MuI(i - first_inindex) = model.States[s].Mu(i);
228  }
229  for (int i = first_inindex; i <= last_inindex; i++)
230  for (int j = first_inindex; j <= last_inindex; j++)
231  {
232  gmmpinv[s].SigmaII(i - first_inindex, j - first_inindex) =
233  model.States[s].Sigma(i, j);
234  }
235 
236  gmmpinv[s].SigmaII.Inverse(gmmpinv[s].SigmaIIInv, &det);
237  //gmmpinv[s].SigmaIIInv = gmmpinv[s].SigmaII.Inverse();
238  //gmmpinv[s].SigmaII.Inverse(&det);
239  if (det < 0)
240  {
241  det = 1e-30;
242  }
243  gmmpinv[s].detSigmaII = det;
244  }
245 
246  nbDimI = last_inindex - first_inindex + 1;
247  gfDiff.Resize(nbDimI);
248  gfDiffp.Resize(nbDimI);
249  gDer.Resize(nbDimI);
250 }
251 
252 double
254 {
255  double p;
256  gfDiff = x - gmmpinv[state].MuI;
257  gfDiffp = gmmpinv[state].SigmaIIInv * gfDiff;
258 
259  p = exp(-0.5 * gfDiff.Dot(gfDiffp)) /
260  sqrt(pow(2.0 * PI, nbDimI) * (gmmpinv[state].detSigmaII + 1e-30));
261 
262  return p;
263 }
264 
265 double
267 {
268  double totalP = 0;
269  for (unsigned int s = 0; s < model.nbStates; s++)
270  {
271  totalP += model.States[s].Prio * GaussianPDFFast(s, x);
272  }
273  return totalP;
274 }
275 
278 {
279  gDer.Zero();
280  for (unsigned int s = 0; s < model.nbStates; s++)
281  {
282  gDer += (gmmpinv[s].SigmaIIInv * (x - gmmpinv[s].MuI)) * model.States[s].Prio *
283  GaussianPDFFast(s, x);
284  }
285  return -gDer;
286 }
287 
288 void
289 Gaussians::InitFastGMR(int first_inindex, int last_inindex, int first_outindex, int last_outindex)
290 {
291  double det;
292  int nbIN = last_inindex - first_inindex + 1;
293  int nbOUT = last_outindex - first_outindex + 1;
294 
295  gPdf.Resize(model.nbStates);
296 
297  for (unsigned int s = 0; s < model.nbStates; s++)
298  {
299  gmmpinv[s].MuI.Resize(nbIN);
300  gmmpinv[s].SigmaII.Resize(nbIN, nbIN);
301  gmmpinv[s].SigmaIIInv.Resize(nbIN, nbIN);
302 
303  gmmpinv[s].muO.Resize(nbOUT);
304  gmmpinv[s].SigmaIO.Resize(nbIN, nbOUT);
305  gmmpinv[s].SigmaIOInv.Resize(nbOUT, nbOUT);
306  }
307 
308  for (unsigned int s = 0; s < model.nbStates; s++)
309  {
310  for (int i = first_inindex; i <= last_inindex; i++)
311  {
312  gmmpinv[s].MuI(i - first_inindex) = model.States[s].Mu(i);
313 
314  for (int j = first_inindex; j <= last_inindex; j++)
315  {
316  gmmpinv[s].SigmaII(i - first_inindex, j - first_inindex) =
317  model.States[s].Sigma(i, j);
318  }
319  for (int j = first_outindex; j <= last_outindex; j++)
320  {
321  gmmpinv[s].SigmaIO(i - first_inindex, j - first_outindex) =
322  model.States[s].Sigma(i, j);
323  }
324  }
325 
326  for (int i = first_outindex; i <= last_outindex; i++)
327  {
328  gmmpinv[s].muO(i - first_outindex) = model.States[s].Mu(i);
329  }
330 
331  gmmpinv[s].SigmaII.Inverse(gmmpinv[s].SigmaIIInv, &det);
332  if (det < 0)
333  {
334  det = 1e-30;
335  }
336  gmmpinv[s].detSigmaII = det;
337  (gmmpinv[s].SigmaIO).Transpose().Inverse(gmmpinv[s].SigmaIOInv, &det);
338  }
339 
340  nbDimI = last_inindex - first_inindex + 1;
341  gfDiff.Resize(nbDimI);
342  gfDiffp.Resize(nbDimI);
343  gDer.Resize(nbDimI);
344 }
345 
346 void
348  MathLib::Vector& outdata,
349  MathLib::Matrix& derGMR)
350 {
351  Regression(indata, outdata);
352  cout << "derivative is not implemented yet " << endl;
353 }
354 
355 void
357 {
358  double pdfall;
359  MathLib::Vector h(model.nbStates);
360  MathLib::Vector r_diff(outdata.Size());
361 
362  for (unsigned int s = 0; s < model.nbStates; s++)
363  {
364  gPdf(s) = model.States[s].Prio * GaussianPDFFast(s, indata);
365  }
366  pdfall = gPdf.Sum();
367 
368  outdata.Zero();
369  for (unsigned int s = 0; s < model.nbStates; s++)
370  {
371  //h(s) = gPdf(s)/(pdfall + 1e-30 );
372  h(s) = gPdf(s) / (pdfall);
373  r_diff = gmmpinv[s].SigmaIO.Transpose() * gmmpinv[s].SigmaIIInv * (indata - gmmpinv[s].MuI);
374 
375  for (unsigned int i = 0; i < r_diff.Size(); i++)
376  {
377  outdata(i) += h(s) * (r_diff(i) + gmmpinv[s].muO(i));
378  }
379  }
380 }
381 
384 {
385  MathLib::Vector outdata(indata.Size());
386  Regression(indata, outdata);
387  return outdata;
388 }
389 
390 /*
391 #include <math.h>
392 
393 #include "Gaussians.h"
394 #include "armadillo"
395 
396 using namespace arma;
397 using namespace std;
398 
399 Gaussians::Gaussians(GMMs *model)
400 {
401  this->model.nbStates = model->nbStates;
402  this->model.nbDim = model->nbDim;
403 
404  this->model.States = (GMMState *)malloc(model->nbStates*sizeof(GMMState) );
405 
406  for(int s=0; s<model->nbStates; s++ ){
407  this->model.States[s].Mu = model->GMMState[s].Mu;
408  this->model.States[s].Sigma = model->GMMState[s].Sigma;
409  this->model.States[s].Prio = model->GMMState[s].Prio;
410  }
411 }
412 
413 Gaussians::Gaussians(int nbStates, int nbDim, char *f_mu, char *f_sigma, char *f_prio)
414 {
415 
416  int s, i, j;
417 
418  model.nbStates = nbStates;
419  model.nbDim = nbDim;
420  model.States = (GMMState *)malloc(nbStates*sizeof(GMMState) );
421 
422  for( s=0; s<nbStates; s++ ){
423  model.States[s].Mu = zeros<vec>(nbDim);
424  model.States[s].Sigma = zeros<mat>(nbDim, nbDim );
425  }
426 
427  // f_mu
428  ifstream fin;
429  fin.open(f_mu);
430  for( i=0; i<nbDim; i++ ){
431  for( s=0; s<nbStates; s++ ){
432  fin >> model.States[s].Mu(i);
433  }
434  }
435  fin.close();
436 
437  // f_sigma
438  fin.open(f_sigma);
439  for( s=0; s<nbStates; s++ ){
440  for( i=0; i<nbDim; i++ ){
441  for( j=0; j<nbDim; j++ ){
442  fin >> model.States[s].Sigma(i,j);
443  }
444  }
445  }
446  fin.close();
447 
448  // f_prio
449  fin.open(f_prio);
450  for( s=0; s<nbStates; s++ ){
451  fin >>model.States[s].Prio;
452  }
453  fin.close();
454 }
455 
456 void Gaussians::setGMMs(GMMs *model)
457 {
458  for(int s=0; s<model->nbStates; s++ ){
459  this->model.States[s].Mu = model->GMMState[s].Mu;
460  this->model.States[s].Sigma = model->GMMState[s].Sigma;
461  this->model.States[s].Prio = model->GMMState[s].Prio;
462  }
463 }
464 
465 
466 void Gaussians::InitFastGaussians(int first_inindex, int last_inindex)
467 {
468  gmmpinv = (GMMStateP *)malloc(model.nbStates*sizeof(GMMStateP) );
469 
470  for(int s=0; s<model.nbStates; s++ ){
471  gmmpinv[s].MuI = model.States[s].Mu.subvec(first_inindex, last_inindex);
472  gmmpinv[s].SigmaII = model.States[s].Sigma.submat(first_inindex, first_inindex, last_inindex, last_inindex);
473  gmmpinv[s].SigmaIIInv = pinv(gmmpinv[s].SigmaII);
474  gmmpinv[s].detSigmaII = det(gmmpinv[s].SigmaII);
475  }
476 
477  nbDimI = last_inindex - first_inindex +1;
478  gfDiff = zeros<vec>(nbDimI);
479  gfDiffp = zeros<vec>(nbDimI);
480  gDer = zeros<vec>(nbDimI);
481 }
482 
483 double Gaussians::GaussianPDFFast(int state, vec x)
484 {
485  double p;
486  gfDiff = x - gmmpinv[state].MuI;
487  gfDiffp = gmmpinv[state].SigmaIIInv * gfDiff;
488 
489  p = exp(-0.5*dot(gfDiff, gfDiffp)) / sqrt(pow(2.0*math::pi(), nbDimI)*( gmmpinv[state].detSigmaII +1e-30));
490 
491  return p;
492 }
493 
494 double Gaussians::GaussianProbFast(vec x)
495 {
496  double totalP=0;
497  for(int s=0; s<model.nbStates; s++ ){
498  totalP += model.States[s].Prio*GaussianPDFFast(s,x);
499  }
500  return totalP;
501 }
502 
503 vec Gaussians::GaussianDerProbFast(vec x)
504 {
505  gDer.zeros();
506  for(int s=0; s<model.nbStates; s++ ){
507  gDer += model.States[s].Prio * gmmpinv[s].SigmaIIInv *(x-gmmpinv[s].MuI)*GaussianPDFFast(s,x);
508  }
509  return -gDer;
510 }
511 
512 //-------------------------------------------------------------------------------------------------------
513 void AllocateGMMs(GMMs *model, int nbDim, int nbStates)
514 {
515  model->nbDim = nbDim;
516  model->nbStates = nbStates;
517  model->GMMState = (GMMState *)malloc(nbStates*sizeof(GMMState) );
518 
519  for(int s=0; s<nbStates; s++ ){
520  model->GMMState[s].Mu = zeros<vec>(nbDim);
521  model->GMMState[s].Sigma = zeros<mat>(nbDim, nbDim );
522  }
523 }
524 
525 
526 double GaussianPDF(vec x, vec Mu, mat Sigma)
527 {
528  double p;
529  vec diff = x - Mu;
530  vec diffp = pinv( Sigma ) * diff;
531  int nbDim = x.size();
532 
533  p = exp(-0.5*dot(diff, diffp)) / sqrt(pow(2.0*math::pi(), nbDim)*( abs(det(Sigma)) +1e-30));
534 
535  if(p < 1e-30){
536  return 1e-30;
537  }
538  else{
539  return p;
540  }
541 }
542 
543 void GaussianMux(GMMs *modelK, GMMs *modelL, GMMs *modelOut)
544 {
545  int k,l,j;
546  int K = modelK->nbStates;
547  int L = modelL->nbStates;
548  int J = K*L;
549 
550  //modelOut->nbDim = modelK->nbDim;
551  //modelOut->nbStates = J;
552  //modelOut->GMMState = (GMMState *)malloc(J*sizeof(GMMState) );
553 
554  j=0;
555  for(k=0; k<K; k++){
556  for(l=0; l<L; l++){
557  modelOut->GMMState[j].Sigma = pinv( pinv(modelK->GMMState[k].Sigma) + pinv( modelL->GMMState[l].Sigma) );
558  modelOut->GMMState[j].Mu = modelOut->GMMState[j].Sigma *( pinv(modelK->GMMState[k].Sigma) * modelK->GMMState[k].Mu + pinv(modelL->GMMState[l].Sigma) * modelL->GMMState[l].Mu );
559  modelOut->GMMState[j].Prio = modelK->GMMState[k].Prio* modelL->GMMState[l].Prio * GaussianPDF( modelK->GMMState[k].Mu, modelL->GMMState[l].Mu, modelK->GMMState[k].Sigma + modelL->GMMState[l].Sigma);
560  j++;
561  }
562  }
563 }
564 
565 void GaussianRotate(GMMs *model, arma::vec P, arma::mat R, GMMs *modelOut)
566 {
567  for(int s=0; s<model->nbStates; s++){
568  modelOut->GMMState[s].Mu = R*model->GMMState[s].Mu + P;
569  modelOut->GMMState[s].Sigma = R*model->GMMState[s].Sigma*trans(R);
570  }
571  //modelOut->nbDim = model->nbDim;
572  //modelOut->nbStates = model->nbStates;
573 }
574 */
Gaussians::GaussianProbFast
double GaussianProbFast(MathLib::Vector x)
Definition: Gaussians.cpp:266
Matrix
Eigen::Matrix< T, 3, 3 > Matrix
Definition: UnscentedKalmanFilterTest.cpp:40
Vector
Eigen::Matrix< T, 3, 1 > Vector
Definition: UnscentedKalmanFilterTest.cpp:39
PI
#define PI
Definition: gdiam.cpp:42
GMMs::States
GMMState States[GAUSSIAN_MAXIMUM_NUMBER]
Definition: Gaussians.h:40
GMMState::Mu
MathLib::Vector Mu
Definition: Gaussians.h:17
Gaussians::Gaussians
Gaussians(const char *f_mu, const char *f_sigma, const char *f_prio)
Definition: Gaussians.cpp:33
Gaussians::GaussianDerProbFast
MathLib::Vector GaussianDerProbFast(MathLib::Vector x)
Definition: Gaussians.cpp:277
Gaussians::GaussianPDFFast
double GaussianPDFFast(int state, MathLib::Vector x)
Definition: Gaussians.cpp:253
GMMs
Definition: Gaussians.h:35
Gaussians::InitFastGMR
void InitFastGMR(int first_inindex, int last_inindex, int first_outindex, int last_outindex)
Definition: Gaussians.cpp:289
GfxTL::sqrt
VectorXD< D, T > sqrt(const VectorXD< D, T > &a)
Definition: VectorXD.h:704
std
Definition: Application.h:66
Gaussians.h
GMMs::nbStates
unsigned int nbStates
Definition: Gaussians.h:37
Gaussians::InitFastGaussians
void InitFastGaussians(int first_inindex, int last_inindex)
Definition: Gaussians.cpp:211
Gaussians::setGMMs
void setGMMs(GMMs *model)
Definition: Gaussians.cpp:200
GMMState::Sigma
MathLib::Matrix Sigma
Definition: Gaussians.h:18
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
GMMState::Prio
double Prio
Definition: Gaussians.h:19
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
Gaussians::Regression
void Regression(const MathLib::Vector &indata, MathLib::Vector &outdata, MathLib::Matrix &derGMR)
Definition: Gaussians.cpp:347