22 #ifndef _DISCRETE_ADABOOST_H
23 #define _DISCRETE_ADABOOST_H
29 #define _epsilon (1E-10)
34 #include "../DataSet.h"
44 template<
class DataSetType>
45 static void Update(DataSetType & set,
double alpha)
47 double bw = exp( alpha );
52 for(
unsigned int i =0; i<set.Size(); i++)
54 set.templates[i].d *= (set.templates[i].correct() ? gw : bw);
55 z+= set.templates[i].d;
57 std::cout <<
"z:" << z <<
" bw:" << bw <<
" gw:" << gw << std::endl;
60 for(
unsigned int i =0; i<set.Size(); i++)
62 set.templates[i].d *= z;
66 dmin = dmax = set.templates[0].d;
68 for(
unsigned int i =1; i<set.Size(); i++)
71 if(set.templates[i].d>dmax)
72 dmax = set.templates[i].d;
73 if(set.templates[i].d<dmin)
74 dmin = set.templates[i].d;
76 std::cout <<
"Distribution weights range from " << dmin <<
" to " << dmax <<
"." << std::endl;
83 template<
class DataSetType>
87 for(
unsigned int i =0; i<set.Size(); i++)
88 if( !set.templates[i].correct() )
89 e += set.templates[i].d;
96 template<
class DataSetType>
97 static double Z(
const DataSetType & set,
float alpha)
100 double gw = exp( -alpha);
101 double bw = exp( alpha);
102 for(
unsigned int i =0; i<set.Size(); i++)
103 Z += set.templates[i].d * ( set.templates[i].correct() ? gw : bw );
109 template<
class DataSetType>
112 double bw = exp( alpha );
117 for(
unsigned int i =0; i<train.Size(); i++)
119 train.templates[i].d *= (train.templates[i].correct() ? gw : bw);
120 z+= train.templates[i].d;
122 std::cout <<
"z:" << z <<
" bw:" << bw <<
" gw:" << gw << std::endl;
125 for(
unsigned int i =0; i<train.Size(); i++)
127 train.templates[i].d *= z;
131 dmin = dmax = train.templates[0].d;
132 for(
unsigned int i =1; i<train.Size(); i++)
134 if(train.templates[i].d>dmax)
135 dmax = train.templates[i].d;
136 if(train.templates[i].d<dmin)
137 dmin = train.templates[i].d;
139 std::cout <<
"Distribution weights range from " << dmin <<
" to " << dmax << std::endl;
144 template<
class Classifier,
class DataSetType>
145 static double ComputeW(
const Classifier & c, DataSetType & train)
159 template<
class WeakClassifier>
172 template<
class Classifier,
class DataSetType>
176 for(
unsigned int i =0; i<set.Size(); i++)
178 set.templates[i].test = h.classify(getData1(set.templates[i], set), getData2(set.templates[i], set));
179 if( set.templates[i].correct() )
180 wp += set.templates[i].d;
182 wn += set.templates[i].d;
193 template<
class R,
class DataSetType>
194 static void Evaluate(DataSetType & set,
const R & h,
double & alpha,
double & Z,
double & wp)
197 Evaluate(set, h, wp, wn);
199 Z = 2.0 * sqrt( wn * wp);
201 alpha = 0.5 * log ( (wp + _epsilon) / (wn + _epsilon) );
216 template<
class DataSetType>
219 double bestAlpha1, bestZ1, bestW1;
220 double bestAlpha, bestZ, bestW;
224 Evaluate(training_set, H, bestAlpha1, bestZ1, bestW1);
225 Evaluate(validation_set, H, bestAlpha, bestZ, bestW);
228 H.
alpha = bestAlpha1;
234 std::cout <<
"[best] V(T) ";
237 std::cout << H.debug_name() <<
' ';
239 std::cout <<
"Z:" << bestZ <<
"(" << bestZ1 <<
"), Alpha:" << bestAlpha <<
"(" << bestAlpha1 <<
"), W:" << bestW <<
"(" << bestW1 <<
"). ";
241 for(
typename DataSetType::ListType::const_iterator i = validation_set.templates.begin(); i != validation_set.templates.end(); ++i)
251 std::cout << cdp <<
"(+) " << cdn <<
"(-) correct detection (" << ((cdp+cdn)*100)/validation_set.Size() <<
"%)\n";
263 std::cerr <<
"Trying to use a negative classifier! alpha=" << H.
alpha << std::endl;
269 template<
class Classifier,
class DataSetType>
273 Evaluate(train, c, alpha, Z, wp);
static bool Update(BoostableClassifier< WeakClassifier > &H, DataSetType &training_set, DataSetType &validation_set, bool verbose=true)
Definition: DiscreteAdaBoost.h:217
static double Z(const DataSetType &set, float alpha)
Definition: DiscreteAdaBoost.h:97
a Voting Boostable classifier
static void Evaluate(DataSetType &set, const Classifier &h, double &wp, double &wn)
Definition: DiscreteAdaBoost.h:173
Definition: DiscreteAdaBoost.h:39
static double CalculateError(const DataSetType &set)
Definition: DiscreteAdaBoost.h:84
static void Update(DataSetType &set, double alpha)
Definition: DiscreteAdaBoost.h:45
static void Evaluate(DataSetType &set, const R &h, double &alpha, double &Z, double &wp)
Definition: DiscreteAdaBoost.h:194
static void UpdateWeights(DataSetType &train, double alpha)
Definition: DiscreteAdaBoost.h:110
float alpha
Weight associated to this classifier.
Definition: BoostableClassifier.h:43
static double ComputeW(const Classifier &c, DataSetType &train)
Definition: DiscreteAdaBoost.h:145
static double ComputeAlpha(const Classifier &c, DataSetType &train)
Definition: DiscreteAdaBoost.h:270
Definition: AdaBoost.h:32
Definition: BoostableClassifier.h:40