123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- /**
- * @file LabeledSetSelection.h
- * @brief Select a subset of a LabeledSet
- * @author Erik Rodner
- * @date 02/08/2008
- */
- #ifndef LABELEDSETSELECTIONINCLUDE
- #define LABELEDSETSELECTIONINCLUDE
- #include "core/image/ImageT.h"
- #include "core/vector/VectorT.h"
- #include "core/vector/MatrixT.h"
- #include <set>
- #include <map>
- namespace OBJREC
- {
- /** Select a subset of a LabeledSet */
- template <class F>
- class LabeledSetSelection
- {
- protected:
- public:
- static void selectRandom ( const std::map<int,int> & fixedPositiveExamples, const F & base, F & positive, F & negative )
- {
- F & base_nonconst = const_cast< F & > ( base );
- //srand(time(NULL));
- for ( std::map<int,int>::const_iterator i = fixedPositiveExamples.begin();
- i != fixedPositiveExamples.end() ;
- i++ )
- {
- int classno = i->first;
- int fixedPositiveExamples = i->second;
- std::set<int> memory;
- int count = base_nonconst[classno].size();
- if ( ( count < fixedPositiveExamples ) )
- {
- fthrow ( NICE::Exception, "LabeledSetSelection::selectRandom: unable to select " << fixedPositiveExamples
- << " of " << count << " examples" );
- }
- for ( int j = 0 ; j < fixedPositiveExamples ; j++ )
- {
- int k;
- do
- {
- k = rand() % count;
- }
- while ( memory.find ( k ) != memory.end() );
- memory.insert ( k );
- positive.add_reference ( classno, base_nonconst[classno][k] );
- }
- for ( int k = 0 ; k < count ; k++ )
- if ( memory.find ( k ) == memory.end() )
- negative.add_reference ( classno, base_nonconst[classno][k] );
- }
- }
- static void selectRandomMax ( const std::map<int,int> & fixedPositiveExamples, const F & base, F & positive, F & negative )
- {
- F & base_nonconst = const_cast< F & > ( base );
- //srand(time(NULL));
- for ( std::map<int,int>::const_iterator i = fixedPositiveExamples.begin();
- i != fixedPositiveExamples.end() ;
- i++ )
- {
- int classno = i->first;
- int fixedPositiveExamples = i->second;
- std::set<int> memory;
- int count = base_nonconst[classno].size();
- int m = fixedPositiveExamples < count ? fixedPositiveExamples : count;
- for ( int j = 0 ; j < m ; j++ )
- {
- int k;
- do
- {
- k = rand() % count;
- }
- while ( memory.find ( k ) != memory.end() );
- memory.insert ( k );
- positive.add_reference ( classno, base_nonconst[classno][k] );
- }
- for ( int k = 0 ; k < count ; k++ )
- if ( memory.find ( k ) == memory.end() )
- negative.add_reference ( classno, base_nonconst[classno][k] );
- }
- }
- static void selectSequentialStep ( const std::map<int, int> & fixedPositiveExamples, const F & base, F & positive, F & negative )
- {
- F & base_nonconst = const_cast< F & > ( base );
- for ( std::map<int,int>::const_iterator i = fixedPositiveExamples.begin();
- i != fixedPositiveExamples.end() ;
- i++ )
- {
- int classno = i->first;
- int fixedPositiveExamples = i->second;
- int count = base_nonconst[classno].size();
- int step = fixedPositiveExamples ? ( count / fixedPositiveExamples ) : 0;
- if ( count < fixedPositiveExamples )
- {
- fthrow ( NICE::Exception, "LabeledSetSelection::selectSequentialStep: unable to select " << fixedPositiveExamples
- << " of " << count << " examples (classno " << classno << ")" );
- }
- int k = 0;
- for ( int j = 0 ; j < count ; j++ )
- {
- if ( ( step == 0 ) || ( k >= fixedPositiveExamples ) || ( j % step != 0 ) )
- negative.add_reference ( classno, base_nonconst[classno][j] );
- else
- {
- k++;
- positive.add_reference ( classno, base_nonconst[classno][j] );
- }
- }
- }
- };
- static void selectSequential ( const std::map<int, int> & fixedPositiveExamples, const F & base, F & positive, F & negative )
- {
- F & base_nonconst = const_cast< F & > ( base );
- for ( std::map<int,int>::const_iterator i = fixedPositiveExamples.begin();
- i != fixedPositiveExamples.end() ;
- i++ )
- {
- int classno = i->first;
- int fixedPositiveExamples = i->second;
- int count = base_nonconst[classno].size();
- if ( count < fixedPositiveExamples )
- {
- fthrow ( NICE::Exception, "LabeledSetSelection::selectSequential: unable to select " << fixedPositiveExamples
- << " of " << count << " examples" );
- }
- for ( int j = 0 ; j < fixedPositiveExamples ; j++ )
- positive.add_reference ( classno, base_nonconst[classno][j] );
- for ( int j = fixedPositiveExamples ; j < count ; j++ )
- negative.add_reference ( classno, base_nonconst[classno][j] );
- }
- };
- static void selectClasses ( const std::set<int> & classnos, const F & base, F & positive, F & negative )
- {
- F & base_nonconst = const_cast< F & > ( base );
- std::vector<int> classes;
- base.getClasses ( classes );
- for ( std::set<int>::const_iterator i = classnos.begin();
- i != classnos.end() ;
- i++ )
- {
- int classno = *i;
- int count = base_nonconst[classno].size();
- for ( int j = 0 ; j < count ; j++ )
- positive.add_reference ( classno, base_nonconst[classno][j] );
- }
- for ( std::vector<int>::const_iterator i = classes.begin();
- i != classes.end() ;
- i++ )
- {
- int classno = *i;
- if ( classnos.find ( classno ) != classnos.end() ) continue;
- int count = base_nonconst[classno].size();
- for ( int j = 0 ; j < count ; j++ )
- negative.add_reference ( classno, base_nonconst[classno][j] );
- }
- };
- };
- } // namespace
- #endif
|