X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=loss_machine.cc;h=fd1d07b9915e8690b5bea02be9e5c600fe85d972;hb=b8222ae1fb874f0783803f55e0bc4c4b9ffca8b2;hp=6ff78d59ab9f200b75575585b1df299f66e8f399;hpb=d922ad61d35e9a6996730bec24b16f8bf7bc426c;p=folded-ctf.git
diff --git a/loss_machine.cc b/loss_machine.cc
index 6ff78d5..fd1d07b 100644
--- a/loss_machine.cc
+++ b/loss_machine.cc
@@ -12,7 +12,9 @@
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see . //
// //
-// Written by Francois Fleuret, (C) IDIAP //
+// Written by Francois Fleuret //
+// (C) Idiap Research Institute //
+// //
// Contact for comments & bug reports //
///////////////////////////////////////////////////////////////////////////
@@ -38,47 +40,6 @@ void LossMachine::get_loss_derivatives(SampleSet *samples,
}
break;
- case LOSS_EV_REGULARIZED:
- {
- 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 < samples->nb_samples(); n++) {
- if(samples->label(n) > 0) {
- sum_pos += responses[n];
- sum_sq_pos += sq(responses[n]);
- nb_pos += 1.0;
- }
- else if(samples->label(n) < 0) {
- sum_neg += responses[n];
- sum_sq_neg += sq(responses[n]);
- nb_neg += 1.0;
- }
- }
-
- m_pos = sum_pos / nb_pos;
- v_pos = sum_sq_pos/(nb_pos - 1) - sq(sum_pos)/(nb_pos * (nb_pos - 1));
-
- scalar_t loss_pos = nb_pos * exp(v_pos/2 - m_pos);
-
- m_neg = sum_neg / nb_neg;
- v_neg = sum_sq_neg/(nb_neg - 1) - sq(sum_neg)/(nb_neg * (nb_neg - 1));
-
- scalar_t loss_neg = nb_neg * exp(v_neg/2 + m_neg);
-
- for(int n = 0; n < samples->nb_samples(); n++) {
- if(samples->label(n) > 0) {
- derivatives[n] =
- ( - 1/nb_pos + (responses[n] - m_pos)/(nb_pos - 1)) * loss_pos;
- } else if(samples->label(n) < 0) {
- derivatives[n] =
- ( 1/nb_neg + (responses[n] - m_neg)/(nb_neg - 1)) * loss_neg;
- }
- }
- }
-
- break;
-
case LOSS_HINGE:
{
for(int n = 0; n < samples->nb_samples(); n++) {
@@ -123,40 +84,6 @@ scalar_t LossMachine::loss(SampleSet *samples, scalar_t *responses) {
}
break;
- case LOSS_EV_REGULARIZED:
- {
- 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 < samples->nb_samples(); n++) {
- if(samples->label(n) > 0) {
- sum_pos += responses[n];
- sum_sq_pos += sq(responses[n]);
- nb_pos += 1.0;
- } else if(samples->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);
- }
-
- 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);
- }
-
- }
- break;
-
case LOSS_HINGE:
{
for(int n = 0; n < samples->nb_samples(); n++) {
@@ -200,6 +127,7 @@ scalar_t LossMachine::optimal_weight(SampleSet *sample_set,
case LOSS_EXPONENTIAL:
{
scalar_t num = 0, den = 0, z;
+
for(int n = 0; n < sample_set->nb_samples(); n++) {
z = sample_set->label(n) * weak_learner_responses[n];
if(z > 0) {
@@ -213,103 +141,6 @@ scalar_t LossMachine::optimal_weight(SampleSet *sample_set,
}
break;
- 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;
- }
-
case LOSS_HINGE:
case LOSS_LOGISTIC:
{
@@ -388,8 +219,6 @@ void LossMachine::subsample(int nb, scalar_t *labels, scalar_t *responses,
}
} while(nb_sampled < nb_to_sample);
- (*global.log_stream) << "nb_sampled = " << nb_sampled << " nb_to_sample = " << nb_to_sample << endl;
-
(*global.log_stream) << "Done." << endl;
delete[] sampled_indexes;