VCOneVsAll.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /**
  2. * @file VCOneVsAll.cpp
  3. * @author Erik Rodner
  4. * @date 10/25/2007
  5. */
  6. #include <iostream>
  7. #include "core/image/ImageT.h"
  8. #include "core/imagedisplay/ImageDisplay.h"
  9. #include "vislearning/classifier/vclassifier/VCOneVsAll.h"
  10. using namespace std;
  11. using namespace NICE;
  12. using namespace OBJREC;
  13. VCOneVsAll::VCOneVsAll ( const Config *_conf, const VecClassifier *_prototype )
  14. : VecClassifier ( _conf ), prototype(_prototype)
  15. {
  16. }
  17. VCOneVsAll::~VCOneVsAll()
  18. {
  19. }
  20. ClassificationResult VCOneVsAll::classify ( const NICE::Vector & x ) const
  21. {
  22. FullVector scores ( maxClassNo+1 );
  23. vector<bool> exists(maxClassNo+1, false);
  24. scores.set(0.0);
  25. double minval = numeric_limits<double>::max();
  26. for ( vector< pair<int, VecClassifier *> >::const_iterator i =
  27. classifiers.begin(); i != classifiers.end(); i++ )
  28. {
  29. int classno = i->first;
  30. exists[classno] = true;
  31. VecClassifier *classifier = i->second;
  32. ClassificationResult r = classifier->classify(x);
  33. scores[classno] += r.scores[1];
  34. minval = std::min(minval, scores[classno]);
  35. }
  36. for(int i = 0; i <= maxClassNo; i++)
  37. {
  38. if(!exists[i])
  39. {
  40. scores[i] = minval-numeric_limits<double>::epsilon();
  41. }
  42. }
  43. return ClassificationResult ( scores.maxElement(), scores );
  44. }
  45. void VCOneVsAll::teach ( const LabeledSetVector & _teachSet )
  46. {
  47. if ( _teachSet.count() <= 0 )
  48. fthrow(Exception, "Number of training examples is zero!\n");
  49. maxClassNo = _teachSet.getMaxClassno();
  50. classifiers.clear();
  51. for ( int i = 0 ; i <= maxClassNo ; i++ )
  52. {
  53. LabeledSetVector binarySubSet (true);
  54. LabeledSetVector::const_iterator exiv = _teachSet.find(i);
  55. if ( exiv == _teachSet.end() )
  56. {
  57. // a test example might be classified as this class
  58. // if we do not use probability scores
  59. cerr << "Class " << i << " does not have any training examples; skipping training." << endl;
  60. continue;
  61. }
  62. int poscount = _teachSet.count(i);
  63. int negcount = _teachSet.count() - poscount;
  64. int mincount = std::min(poscount, negcount);
  65. int c = 0;
  66. for ( vector<Vector *>::const_iterator exi = exiv->second.begin();
  67. exi != exiv->second.end(); exi++, c++ )
  68. {
  69. binarySubSet.add_reference ( 1, *exi );
  70. if( c >= mincount)
  71. break;
  72. }
  73. c = 0;
  74. for ( LabeledSetVector::const_iterator exjv = _teachSet.begin();
  75. exjv != _teachSet.end(); exjv++ , c++)
  76. {
  77. if ( exjv == exiv ) continue;
  78. for ( vector<Vector *>::const_iterator exj = exjv->second.begin();
  79. exj != exjv->second.end(); exj++ )
  80. binarySubSet.add_reference ( 0, *exj );
  81. if( c >= mincount)
  82. break;
  83. }
  84. VecClassifier *classifier;
  85. classifier = prototype->clone();
  86. fprintf (stderr, "Training classifier: class %d <-> remainder\n", i );
  87. classifier->teach ( binarySubSet );
  88. classifier->finishTeaching();
  89. classifiers.push_back ( pair<int, VecClassifier*> (i, classifier) );
  90. }
  91. }
  92. void VCOneVsAll::finishTeaching()
  93. {
  94. }
  95. VecClassifier *VCOneVsAll::clone(void) const
  96. {
  97. VCOneVsAll *classifier = new VCOneVsAll( *this );
  98. return classifier;
  99. }
  100. VCOneVsAll::VCOneVsAll( const VCOneVsAll &vcova ): VecClassifier()
  101. {
  102. prototype = vcova.prototype->clone();
  103. for(int i = 0; i < (int)vcova.classifiers.size(); i++)
  104. {
  105. classifiers.push_back(pair<int, VecClassifier*>(vcova.classifiers[i].first,vcova.classifiers[i].second->clone()));
  106. }
  107. }