PDFParzenMulti.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /**
  2. * @file PDFParzenMulti.cpp
  3. * @brief Normal Distribution / Gaussian PDF
  4. * @author Erik Rodner
  5. * @date 01/29/2008
  6. */
  7. #include <iostream>
  8. #include <assert.h>
  9. #include <core/vector/Algorithms.h>
  10. #include "vislearning/math/pdf/PDFParzenMulti.h"
  11. using namespace OBJREC;
  12. const double sqrt_2_m_pi = sqrt(2*M_PI);
  13. using namespace std;
  14. using namespace NICE;
  15. PDFParzenMulti::PDFParzenMulti( const VVector & _samples, const NICE::Matrix & _kernelInvCov )
  16. : samples(_samples), kernelInvCov(_kernelInvCov)
  17. {
  18. assert(_samples.size());
  19. det = NICE::det(kernelInvCov);
  20. dimension = _samples[0].size();
  21. constant = 0.5 * ( dimension * log (2*M_PI) - log(det) );
  22. }
  23. PDFParzenMulti::~PDFParzenMulti()
  24. {
  25. }
  26. double PDFParzenMulti::kernel ( const NICE::Vector & v ) const
  27. {
  28. double bilinear_result = 0.0;
  29. for ( size_t k = 0 ; k < kernelInvCov.rows() ; k++ )
  30. for ( size_t l = k+1; l < kernelInvCov.cols(); l++ )
  31. bilinear_result += 2 * kernelInvCov(k,l) * v[k] * v[l];
  32. for ( size_t k = 0 ; k < kernelInvCov.rows(); k++ )
  33. bilinear_result += kernelInvCov(k,k) * v[k] * v[k];
  34. return exp( 0.5 * ( - bilinear_result ) );
  35. }
  36. double PDFParzenMulti::getNLogDensity ( const NICE::Vector & x ) const
  37. {
  38. assert ( samples.size() > 0 );
  39. if ( x.size() != samples[0].size() )
  40. fthrow(Exception, "Dimensions " << x.size() << " (x) and " << samples[0].size() << " do not match.");
  41. double result = 0.0;
  42. for ( size_t k = 0 ; k < samples.size() ; k++ )
  43. {
  44. Vector n ( samples[k] );
  45. n -= x;
  46. result += kernel(n);
  47. }
  48. result /= (samples.size());
  49. return - log(result) + constant;
  50. }
  51. int PDFParzenMulti::getDimension () const
  52. {
  53. assert ( samples.size() > 0 );
  54. return dimension;
  55. }