Changeset 36


Ignore:
Timestamp:
Feb 12, 2004, 11:29:21 AM (19 years ago)
Author:
Peter
Message:

stop criteria for the traing modified

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/SVM.cc

    r30 r36  
    3434  double u;
    3535  double v;
     36  thep_gsl_api::vector dalpha; 
    3637 
    3738  // Stop criteria 
    38   ofstream myout("alpha.tst");
    39   double tmp;
    40   thep_gsl_api::vector dalpha; 
    41   thep_gsl_api::vector one(E.size(),true,true);
    42   one.set_all(1);
    43   while (count<10000)
     39  bool stop_condition = false;
     40  while(count<100000 && !stop_condition)
    4441    {
    4542     count++; 
    4643     dalpha = alpha_.mul_elements(target_);
    47      E=kernel_*dalpha-target_; //should be done in another way!!
    48      tmp=dalpha*(kernel_*dalpha)/2;
    49      tmp=tmp-alpha_*one;
    50      myout << tmp << '\n';
     44     E = kernel_*dalpha-target_; //should be done in another way!!
     45       
    5146     // Choosing a pair of variables to modify (Should be done more clever)
    5247     u_long index1 = rnd->get_uniform_int(kernel_.cols());
     
    9489     alpha_[index1]+=target_[index1]*target_[index2]*(alpha_[index2]-alpha_new);
    9590     alpha_[index2]=alpha_new;
    96      
    97      
    98      
    99      
    100    
    101 
     91     stop_condition = stop( target_, kernel_, alpha_);
    10292    }
    10393 
    104   myout.close();
    105  
    106   //thep_gsl_api::vector output = kernel_*dalpha;
    107   //for (int i=0; i<64; i++){
    108   //cout << output.get(i) << '\t';
    109   //cout << alpha_.get(i) << endl;
    110   //}
    111 
    11294  trained_= true;
    11395}
    11496
     97bool SVM::stop( const thep_gsl_api::vector& target_,
     98    const thep_gsl_api::matrix& kernel_,
     99    const thep_gsl_api::vector& alpha_)
     100{
     101  double min_output_positive = 10000;
     102  double max_output_negative = -10000;
     103  double epsilon = 0.001; // used twice, should perhaps be two different values
     104  thep_gsl_api::vector output_unbiased = kernel_ * alpha_.mul_elements(target_);
     105  for (u_int i=0; i<target_.size(); i++){
     106   if (target_[i]==1){
     107     if (output_unbiased[i] < min_output_positive)
     108       min_output_positive = output_unbiased[i];
     109   }
     110   else if( output_unbiased[i] > max_output_negative )
     111     max_output_negative = output_unbiased[i];
     112   
     113  }
     114 
     115  if (min_output_positive - max_output_negative < 2-epsilon){
     116   return false;
     117  }
     118  else{
     119   double primal = alpha_.mul_elements(target_)
     120     *  ( alpha_.mul_elements(target_) );
     121   double gap = 2 * primal - alpha_.sum();
     122   if (gap/(primal+1)<epsilon)
     123     return true;
     124   else
     125     return false;
     126  }
     127
     128
     129}
     130
     131
     132
    115133#endif
  • trunk/src/SVM.h

    r30 r36  
    4141    thep_gsl_api::vector target_;
    4242    thep_gsl_api::vector alpha_;
    43   };
     43
     44    /**
     45       Private function that determines when to stop the training
     46    */
     47    bool SVM::stop(const thep_gsl_api::vector& target_,
     48       const thep_gsl_api::matrix& kernel_,
     49       const thep_gsl_api::vector& alpha_);
     50  };
    4451 
    4552    // class SVM
  • trunk/src/vector.cc

    r30 r36  
    212212
    213213
    214 vector vector::mul_elements( const vector& other )
     214vector vector::mul_elements( const vector& other ) const
    215215{
    216216  assert( size() == other.size() );
     
    244244}
    245245
     246double vector::sum() const
     247{
     248  double sum = 0;
     249  for (int i=0; i<size(); i++)
     250   sum += gsl_vector_get( v_, i );
     251  return( sum );
     252
     253 
     254 
    246255
    247256// // Public functions (A-Z)
Note: See TracChangeset for help on using the changeset viewer.