FPCSMLR.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "vislearning/classifier/fpclassifier/logisticregression/FPCSMLR.h"
  2. #include "vislearning/cbaselib/FeaturePool.h"
  3. #include <iostream>
  4. using namespace OBJREC;
  5. using namespace std;
  6. using namespace NICE;
  7. FPCSMLR::FPCSMLR ()
  8. {
  9. inpic = false;
  10. }
  11. FPCSMLR::FPCSMLR ( const Config *_conf, string section ) : conf ( _conf )
  12. {
  13. confsection = section;
  14. inpic = conf->gB ( section, "inpic", false );
  15. }
  16. FPCSMLR::~FPCSMLR()
  17. {
  18. //clean up
  19. }
  20. ClassificationResult FPCSMLR::classify ( Example & pce )
  21. {
  22. FullVector overall_distribution ( maxClassNo + 1 );
  23. overall_distribution[maxClassNo] = 0.0;
  24. double maxp = -numeric_limits<double>::max();
  25. int classno = 0;
  26. double sum = 0.0;
  27. for ( int i = 0; i < maxClassNo; i++ )
  28. {
  29. overall_distribution[i] = classifiers[i].classify ( pce );
  30. sum += overall_distribution[i];
  31. if ( maxp < overall_distribution[i] )
  32. {
  33. classno = i;
  34. maxp = overall_distribution[i];
  35. }
  36. }
  37. for ( int i = 0; i < maxClassNo; i++ )
  38. {
  39. overall_distribution[i] /= sum;
  40. }
  41. return ClassificationResult ( classno, overall_distribution );
  42. }
  43. void FPCSMLR::train ( FeaturePool & _fp, Examples & examples )
  44. {
  45. cout << "start train" << endl;
  46. fp = FeaturePool ( _fp );
  47. // Anzahl von Merkmalen
  48. int fanz = examples.size();
  49. maxClassNo = -1;
  50. for ( int i = 0; i < fanz; i++ )
  51. {
  52. maxClassNo = std::max ( maxClassNo, examples[i].first );
  53. }
  54. maxClassNo++;
  55. assert ( fanz >= maxClassNo );
  56. classifiers.resize ( maxClassNo );
  57. for ( int i = 0; i < maxClassNo; i++ )
  58. {
  59. cout << "classifier no " << i << " training starts" << endl;
  60. classifiers[i] = SLR ( conf, confsection );
  61. if ( inpic )
  62. {
  63. vector<bool> classinpic;
  64. for ( int j = 0; j < ( int ) examples.size(); j++ )
  65. {
  66. if ( examples[j].first == i )
  67. {
  68. if ( examples[j].second.position < ( int ) classinpic.size() )
  69. classinpic[examples[j].second.position] = true;
  70. else if ( examples[j].second.position == ( int ) classinpic.size() )
  71. classinpic.push_back ( true );
  72. else
  73. {
  74. while ( examples[j].second.position > ( int ) classinpic.size() )
  75. {
  76. classinpic.push_back ( false );
  77. }
  78. classinpic.push_back ( true );
  79. }
  80. }
  81. }
  82. Examples ex2;
  83. for ( int j = 0; j < ( int ) examples.size(); j++ )
  84. {
  85. if ( examples[j].second.position >= ( int ) classinpic.size() )
  86. continue;
  87. if ( classinpic[examples[j].second.position] )
  88. {
  89. Example e;
  90. e.svec = examples[j].second.svec;
  91. e.vec = examples[j].second.vec;
  92. ex2.push_back ( pair<int, Example> ( examples[j].first, e ) );
  93. }
  94. }
  95. cout << "examples for class " << i << ": " << ex2.size() << endl;
  96. if ( ex2.size() <= 2 )
  97. continue;
  98. classifiers[i].train ( _fp, ex2, i );
  99. for ( int j = 0; j < ( int ) ex2.size(); j++ )
  100. {
  101. ex2[j].second.svec = NULL;
  102. }
  103. }
  104. else
  105. {
  106. classifiers[i].train ( _fp, examples, i );
  107. }
  108. }
  109. cout << "end train" << endl;
  110. }
  111. void FPCSMLR::restore ( istream & is, int format )
  112. {
  113. is >> maxClassNo;
  114. classifiers.resize ( maxClassNo );
  115. for ( int i = 0; i < maxClassNo; i++ )
  116. {
  117. classifiers[i].restore ( is, format );
  118. }
  119. }
  120. void FPCSMLR::store ( ostream & os, int format ) const
  121. {
  122. if ( format != -9999 ) os << maxClassNo;
  123. for ( int i = 0; i < maxClassNo; i++ )
  124. {
  125. classifiers[i].store ( os, format );
  126. }
  127. }
  128. void FPCSMLR::clear ()
  129. {
  130. //TODO: einbauen
  131. }
  132. FeaturePoolClassifier *FPCSMLR::clone () const
  133. {
  134. //TODO: wenn alle Variablen der Klasse bekannt sind, dann übergebe diese mit
  135. FPCSMLR *o = new FPCSMLR ( conf, confsection );
  136. o->maxClassNo = maxClassNo;
  137. return o;
  138. }
  139. void FPCSMLR::setComplexity ( int size )
  140. {
  141. cerr << "FPCSMLR: no complexity to set" << endl;
  142. }