1 #ifndef RF_EARLY_STOPPING_P_HXX
2 #define RF_EARLY_STOPPING_P_HXX
4 #include "rf_common.hxx"
13 T power(T
const & in,
int n)
15 T result = NumericTraits<T>::one();
16 for(
int ii = 0; ii < n ;++ii)
34 void set_external_parameters(
ProblemSpec<T> const &prob,
int tree_count = 0,
bool is_weighted =
false)
37 is_weighted_ = is_weighted;
38 tree_count_ = tree_count;
47 template<
class WeightIter,
class T,
class C>
73 void set_external_parameters(
ProblemSpec<T> const &prob,
int tree_count = 0,
bool is_weighted =
false)
75 max_tree_ =
ceil(max_tree_p * tree_count);
76 SB::set_external_parameters(prob, tree_count, is_weighted);
79 template<
class WeightIter,
class T,
class C>
82 if(k == SB::tree_count_ -1)
84 depths.push_back(
double(k+1)/
double(SB::tree_count_));
89 depths.push_back(
double(k+1)/
double(SB::tree_count_));
111 proportion_(proportion)
114 template<
class WeightIter,
class T,
class C>
117 if(k == SB::tree_count_ -1)
119 depths.push_back(
double(k+1)/
double(SB::tree_count_));
126 if(prob[
argMax(prob)] > proportion_ *SB::ext_param_.actual_msample_* SB::tree_count_)
128 depths.push_back(
double(k+1)/
double(SB::tree_count_));
134 if(prob[
argMax(prob)] > proportion_ * SB::tree_count_)
136 depths.push_back(
double(k+1)/
double(SB::tree_count_));
169 void set_external_parameters(
ProblemSpec<T> const &prob,
int tree_count = 0,
bool is_weighted =
false)
173 SB::set_external_parameters(prob, tree_count, is_weighted);
175 template<
class WeightIter,
class T,
class C>
178 if(k == SB::tree_count_ -1)
180 depths.push_back(
double(k+1)/
double(SB::tree_count_));
186 last_/= last_.
norm(1);
192 cur_ /= cur_.
norm(1);
194 double nrm = last_.
norm();
197 depths.push_back(
double(k+1)/
double(SB::tree_count_));
227 proportion_(proportion)
230 template<
class WeightIter,
class T,
class C>
233 if(k == SB::tree_count_ -1)
235 depths.push_back(
double(k+1)/
double(SB::tree_count_));
239 double a = prob[
argMax(prob)];
241 double b = prob[
argMax(prob)];
243 double margin = a - b;
246 if(margin > proportion_ *SB::ext_param_.actual_msample_ * SB::tree_count_)
248 depths.push_back(
double(k+1)/
double(SB::tree_count_));
254 if(prob[
argMax(prob)] > proportion_ * SB::tree_count_)
256 depths.push_back(
double(k+1)/
double(SB::tree_count_));
294 double binomial(
int N,
int k,
double p)
300 template<
class WeightIter,
class T,
class C>
303 if(k == SB::tree_count_ -1)
305 depths.push_back(
double(k+1)/
double(SB::tree_count_));
313 int n_a = prob[index];
314 int n_b = prob[(index+1)%2];
315 int n_tilde = (SB::tree_count_ - n_a + n_b);
316 double p_a = double(n_b - n_a + n_tilde)/double(2* n_tilde);
317 vigra_precondition(p_a <= 1,
"probability should be smaller than 1");
323 for(
int ii = 0; ii <= n_b + n_a;++ii)
326 cum_val += binomial(n_b + n_a, ii, p_a);
327 if(cum_val >= 1 -alpha_)
336 depths.push_back(
double(k+1)/
double(SB::tree_count_));
374 double binomial(
int N,
int k,
double p)
380 template<
class WeightIter,
class T,
class C>
383 if(k == SB::tree_count_ -1)
385 depths.push_back(
double(k+1)/
double(SB::tree_count_));
393 int n_a = prob[index];
394 int n_b = prob[(index+1)%2];
395 int n_needed =
ceil(
double(SB::tree_count_)/2.0)-n_a;
396 int n_tilde = SB::tree_count_ - (n_a +n_b);
397 if(n_tilde <= 0) n_tilde = 0;
398 if(n_needed <= 0) n_needed = 0;
400 for(
int ii = n_needed; ii < n_tilde; ++ii)
401 p += binomial(n_tilde, ii, 0.5);
405 depths.push_back(
double(k+1)/
double(SB::tree_count_));
413 #endif //RF_EARLY_STOPPING_P_HXX