- case LOSS_EV_REGULARIZED:
- {
-
- scalar_t u = 0, du = -0.1;
- scalar_t *responses = new scalar_t[sample_set->nb_samples()];
-
- scalar_t l, prev_l = -1;
-
- const scalar_t minimum_delta_for_optimization = 1e-5;
-
- scalar_t shift = 0;
-
- {
- scalar_t sum_pos = 0, sum_sq_pos = 0, nb_pos = 0, m_pos, v_pos;
- scalar_t sum_neg = 0, sum_sq_neg = 0, nb_neg = 0, m_neg, v_neg;
-
- for(int n = 0; n < sample_set->nb_samples(); n++) {
- if(sample_set->label(n) > 0) {
- sum_pos += responses[n];
- sum_sq_pos += sq(responses[n]);
- nb_pos += 1.0;
- } else if(sample_set->label(n) < 0) {
- sum_neg += responses[n];
- sum_sq_neg += sq(responses[n]);
- nb_neg += 1.0;
- }
- }
-
- if(nb_pos > 0) {
- m_pos = sum_pos / nb_pos;
- v_pos = sum_sq_pos/(nb_pos - 1) - sq(sum_pos)/(nb_pos * (nb_pos - 1));
- shift = max(shift, v_pos/2 - m_pos);
- }
-
- if(nb_neg > 0) {
- m_neg = sum_neg / nb_neg;
- v_neg = sum_sq_neg/(nb_neg - 1) - sq(sum_neg)/(nb_neg * (nb_neg - 1));
- shift = max(shift, v_neg/2 + m_neg);
- }
-
-// (*global.log_stream) << "nb_pos = " << nb_pos << " nb_neg = " << nb_neg << endl;
-
- }
-
- int nb = 0;
-
- while(nb < 100 && abs(du) > minimum_delta_for_optimization) {
- nb++;
-
-// (*global.log_stream) << "l = " << l << " u = " << u << " du = " << du << endl;
-
- u += du;
- for(int s = 0; s < sample_set->nb_samples(); s++) {
- responses[s] = current_responses[s] + u * weak_learner_responses[s] ;
- }
-
- {
- scalar_t sum_pos = 0, sum_sq_pos = 0, nb_pos = 0, m_pos, v_pos;
- scalar_t sum_neg = 0, sum_sq_neg = 0, nb_neg = 0, m_neg, v_neg;
-
- for(int n = 0; n < sample_set->nb_samples(); n++) {
- if(sample_set->label(n) > 0) {
- sum_pos += responses[n];
- sum_sq_pos += sq(responses[n]);
- nb_pos += 1.0;
- } else if(sample_set->label(n) < 0) {
- sum_neg += responses[n];
- sum_sq_neg += sq(responses[n]);
- nb_neg += 1.0;
- }
- }
-
- l = 0;
-
- if(nb_pos > 0) {
- m_pos = sum_pos / nb_pos;
- v_pos = sum_sq_pos/(nb_pos - 1) - sq(sum_pos)/(nb_pos * (nb_pos - 1));
- l += nb_pos * exp(v_pos/2 - m_pos - shift);
- }
-
- if(nb_neg > 0) {
- m_neg = sum_neg / nb_neg;
- v_neg = sum_sq_neg/(nb_neg - 1) - sq(sum_neg)/(nb_neg * (nb_neg - 1));
- l += nb_neg * exp(v_neg/2 + m_neg - shift);
- }
-
- }
-
- if(l > prev_l) du = du * -0.25;
- prev_l = l;
- }
-
- delete[] responses;
-
- return u;
- }
-