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
15using namespace std;
16
17/*
18Gaussians::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
33Gaussians::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
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
130Gaussians::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
199void
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
210void
211Gaussians::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
252double
253Gaussians::GaussianPDFFast(int state, MathLib::Vector x)
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
265double
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
276MathLib::Vector
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
288void
289Gaussians::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
346void
347Gaussians::Regression(const MathLib::Vector& indata,
348 MathLib::Vector& outdata,
349 MathLib::Matrix& derGMR)
350{
351 Regression(indata, outdata);
352 cout << "derivative is not implemented yet " << endl;
353}
354
355void
356Gaussians::Regression(const MathLib::Vector& indata, MathLib::Vector& outdata)
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
382MathLib::Vector
383Gaussians::Regression(const MathLib::Vector& indata)
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
396using namespace arma;
397using namespace std;
398
399Gaussians::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
413Gaussians::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
456void 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
466void 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
483double 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
494double 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
503vec 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//-------------------------------------------------------------------------------------------------------
513void 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
526double 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
543void 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
565void 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*/
void Regression(const MathLib::Vector &indata, MathLib::Vector &outdata, MathLib::Matrix &derGMR)
void setGMMs(GMMs *model)
GMMs model
Definition Gaussians.h:49
void InitFastGMR(int first_inindex, int last_inindex, int first_outindex, int last_outindex)
Gaussians(const char *f_mu, const char *f_sigma, const char *f_prio)
Definition Gaussians.cpp:33
MathLib::Vector gDer
Definition Gaussians.h:64
void InitFastGaussians(int first_inindex, int last_inindex)
MathLib::Vector GaussianDerProbFast(MathLib::Vector x)
MathLib::Vector gfDiffp
Definition Gaussians.h:63
MathLib::Vector gfDiff
Definition Gaussians.h:63
MathLib::Vector gPdf
Definition Gaussians.h:65
int nbDimI
Definition Gaussians.h:66
double GaussianProbFast(MathLib::Vector x)
double GaussianPDFFast(int state, MathLib::Vector x)
#define PI
Definition gdiam.cpp:42
This file offers overloads of toIce() and fromIce() functions for STL container types.
double Prio
Definition Gaussians.h:19
MathLib::Matrix Sigma
Definition Gaussians.h:18
MathLib::Vector Mu
Definition Gaussians.h:17
GMMState States[GAUSSIAN_MAXIMUM_NUMBER]
Definition Gaussians.h:40