123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- #include "vislearning/classifier/fpclassifier/logisticregression/FPCSMLR.h"
- #include "vislearning/cbaselib/FeaturePool.h"
- #include <iostream>
- using namespace OBJREC;
- using namespace std;
- using namespace NICE;
- FPCSMLR::FPCSMLR ()
- {
- inpic = false;
- }
- FPCSMLR::FPCSMLR ( const Config *_conf, string section ) : conf ( _conf )
- {
- confsection = section;
- inpic = conf->gB ( section, "inpic", false );
- }
- FPCSMLR::~FPCSMLR()
- {
- //clean up
- }
- ClassificationResult FPCSMLR::classify ( Example & pce )
- {
- FullVector overall_distribution ( maxClassNo + 1 );
- overall_distribution[maxClassNo] = 0.0;
- double maxp = -numeric_limits<double>::max();
- int classno = 0;
- double sum = 0.0;
- for ( int i = 0; i < maxClassNo; i++ )
- {
- overall_distribution[i] = classifiers[i].classify ( pce );
- sum += overall_distribution[i];
- if ( maxp < overall_distribution[i] )
- {
- classno = i;
- maxp = overall_distribution[i];
- }
- }
- for ( int i = 0; i < maxClassNo; i++ )
- {
- overall_distribution[i] /= sum;
- }
- return ClassificationResult ( classno, overall_distribution );
- }
- void FPCSMLR::train ( FeaturePool & _fp, Examples & examples )
- {
- cout << "start train" << endl;
- fp = FeaturePool ( _fp );
- // Anzahl von Merkmalen
- int fanz = examples.size();
- maxClassNo = -1;
- for ( int i = 0; i < fanz; i++ )
- {
- maxClassNo = std::max ( maxClassNo, examples[i].first );
- }
- maxClassNo++;
- assert ( fanz >= maxClassNo );
- classifiers.resize ( maxClassNo );
- for ( int i = 0; i < maxClassNo; i++ )
- {
- cout << "classifier no " << i << " training starts" << endl;
- classifiers[i] = SLR ( conf, confsection );
- if ( inpic )
- {
- vector<bool> classinpic;
- for ( int j = 0; j < ( int ) examples.size(); j++ )
- {
- if ( examples[j].first == i )
- {
- if ( examples[j].second.position < ( int ) classinpic.size() )
- classinpic[examples[j].second.position] = true;
- else if ( examples[j].second.position == ( int ) classinpic.size() )
- classinpic.push_back ( true );
- else
- {
- while ( examples[j].second.position > ( int ) classinpic.size() )
- {
- classinpic.push_back ( false );
- }
- classinpic.push_back ( true );
- }
- }
- }
- Examples ex2;
- for ( int j = 0; j < ( int ) examples.size(); j++ )
- {
- if ( examples[j].second.position >= ( int ) classinpic.size() )
- continue;
- if ( classinpic[examples[j].second.position] )
- {
- Example e;
- e.svec = examples[j].second.svec;
- e.vec = examples[j].second.vec;
- ex2.push_back ( pair<int, Example> ( examples[j].first, e ) );
- }
- }
- cout << "examples for class " << i << ": " << ex2.size() << endl;
- if ( ex2.size() <= 2 )
- continue;
- classifiers[i].train ( _fp, ex2, i );
- for ( int j = 0; j < ( int ) ex2.size(); j++ )
- {
- ex2[j].second.svec = NULL;
- }
- }
- else
- {
- classifiers[i].train ( _fp, examples, i );
- }
- }
- cout << "end train" << endl;
- }
- void FPCSMLR::restore ( istream & is, int format )
- {
- is >> maxClassNo;
- classifiers.resize ( maxClassNo );
- for ( int i = 0; i < maxClassNo; i++ )
- {
- classifiers[i].restore ( is, format );
- }
- }
- void FPCSMLR::store ( ostream & os, int format ) const
- {
- if ( format != -9999 ) os << maxClassNo;
- for ( int i = 0; i < maxClassNo; i++ )
- {
- classifiers[i].store ( os, format );
- }
- }
- void FPCSMLR::clear ()
- {
- //TODO: einbauen
- }
- FeaturePoolClassifier *FPCSMLR::clone () const
- {
- //TODO: wenn alle Variablen der Klasse bekannt sind, dann übergebe diese mit
- FPCSMLR *o = new FPCSMLR ( conf, confsection );
- o->maxClassNo = maxClassNo;
- return o;
- }
- void FPCSMLR::setComplexity ( int size )
- {
- cerr << "FPCSMLR: no complexity to set" << endl;
- }
|