FPCSMLR.cpp 3.5 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. }