123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- /**
- * @file LabeledSetSelection.h
- * @brief Select a subset of a LabeledSet
- * @author Erik Rodner
- * @date 02/08/2008
- */
- #ifndef LABELEDSETSELECTIONINCLUDE
- #define LABELEDSETSELECTIONINCLUDE
- #include <vislearning/nice_nonvis.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 ( 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 ( 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 ( 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
|