PDFParzenMulti.cpp 1.8 KB

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