VCSimpleGaussian.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #ifdef NICE_USELIB_ICE
  2. #include <core/imagedisplay/ImageDisplay.h>
  3. #include <core/iceconversion/convertice.h>
  4. #include <iostream>
  5. #include "vislearning/classifier/vclassifier/VCSimpleGaussian.h"
  6. #include "vislearning/math/pdf/PDFGaussian.h"
  7. using namespace OBJREC;
  8. using namespace std;
  9. using namespace NICE;
  10. VCSimpleGaussian::VCSimpleGaussian( const Config *conf )
  11. {
  12. }
  13. VCSimpleGaussian::~VCSimpleGaussian()
  14. {
  15. clear();
  16. }
  17. double VCSimpleGaussian::calcNLogDensity ( int classno, const NICE::Vector & x ) const
  18. {
  19. std::map<int, PDF *>::const_iterator im = pdfs.find(classno);
  20. if ( im == pdfs.end() ) {
  21. fprintf (stderr, "VCSimpleGaussian: classno %d not trained !!\n", classno);
  22. exit(-1);
  23. }
  24. PDF *pdf = im->second;
  25. double result = pdf->getNLogDensity ( x );
  26. return result;
  27. }
  28. /** classify using simple vector */
  29. ClassificationResult VCSimpleGaussian::classify ( const NICE::Vector & x ) const
  30. {
  31. double min_nlogdensity = std::numeric_limits<double>::max();
  32. int min_class = -1;
  33. FullVector scores ( maxClassNo + 1 );
  34. for ( map<int, ice::Statistics *>::const_iterator i = statistics.begin();
  35. i != statistics.end();
  36. i++ )
  37. {
  38. double nlogdensity = calcNLogDensity ( i->first, x );
  39. scores[i->first] = - nlogdensity;
  40. if ( nlogdensity < min_nlogdensity )
  41. {
  42. min_nlogdensity = nlogdensity;
  43. min_class = i->first;
  44. }
  45. }
  46. return ClassificationResult ( min_class, scores );
  47. }
  48. void VCSimpleGaussian::getVotings ( const NICE::Vector & x,
  49. std::map<int, double> & votings ) const
  50. {
  51. for ( map<int, ice::Statistics *>::const_iterator i = statistics.begin();
  52. i != statistics.end();
  53. i++ )
  54. {
  55. double nlogdensity = calcNLogDensity ( i->first, x );
  56. votings[ i->first ] = nlogdensity;
  57. }
  58. }
  59. PDF *VCSimpleGaussian::getPDF(int classno) const
  60. {
  61. std::map<int, PDF*>::const_iterator im = pdfs.find(classno);
  62. if ( im == pdfs.end() ) {
  63. fprintf (stderr, "VCSimpleGaussian: classno %d not trained !!\n", classno);
  64. exit(-1);
  65. }
  66. PDF *pdf = im->second;
  67. return pdf;
  68. }
  69. /** classify using a simple vector */
  70. void VCSimpleGaussian::teach ( const LabeledSetVector & _teachSet )
  71. {
  72. maxClassNo = _teachSet.getMaxClassno();
  73. LOOP_ALL(_teachSet)
  74. {
  75. EACH(classno, x);
  76. teach ( classno, x );
  77. }
  78. }
  79. void VCSimpleGaussian::teach ( int classno, const NICE::Vector & x )
  80. {
  81. if ( classno > maxClassNo ) maxClassNo = classno;
  82. std::map<int, ice::Statistics *>::iterator i = statistics.find(classno);
  83. if ( i == statistics.end() )
  84. {
  85. statistics[classno] = new ice::Statistics(x.size());
  86. i = statistics.find(classno); // FIXME
  87. }
  88. ice::Statistics *s = i->second;
  89. Put( *s, NICE::makeIceVectorT(x) );
  90. }
  91. void VCSimpleGaussian::finishTeaching()
  92. {
  93. for ( map<int, ice::Statistics *>::iterator i = statistics.begin();
  94. i != statistics.end();
  95. i++ )
  96. {
  97. NICE::Matrix covariance;
  98. NICE::Vector mean;
  99. ice::Statistics *s = i->second;
  100. mean = NICE::makeEVector<double>(Mean(*s));
  101. covariance = NICE::makeDoubleMatrix( Covariance(*s) );
  102. PDF *pdf = new PDFGaussian ( covariance, mean );
  103. pdfs[i->first] = pdf;
  104. }
  105. }
  106. void VCSimpleGaussian::clear ()
  107. {
  108. for ( map<int, ice::Statistics *>::iterator i = statistics.begin();
  109. i != statistics.end();
  110. i++ )
  111. {
  112. ice::Statistics *s = i->second;
  113. delete s;
  114. }
  115. for ( map<int, PDF *>::iterator i = pdfs.begin();
  116. i != pdfs.end();
  117. i++ )
  118. {
  119. PDF *p = i->second;
  120. delete p;
  121. }
  122. pdfs.clear();
  123. statistics.clear();
  124. }
  125. void VCSimpleGaussian::store ( std::ostream & os, int format ) const
  126. {
  127. fprintf (stderr, "NOT YET IMPLEMENTED\n");
  128. exit(-1);
  129. }
  130. void VCSimpleGaussian::restore ( std::istream & is, int format )
  131. {
  132. fprintf (stderr, "NOT YET IMPLEMENTED\n");
  133. exit(-1);
  134. }
  135. #endif