Ignore:
Timestamp:
Feb 21, 2005, 3:53:48 PM (18 years ago)
Author:
Peter
Message:

Major modifications

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/RegressionLocal.cc

    r221 r235  
    1313namespace statistics {
    1414
    15   RegressionLocal::RegressionLocal(const gslapi::vector& x,
    16                                    const gslapi::vector& y,
    17                                    Regression& r,
    18                                    RegressionKernel& k,
    19                                    const size_t nof_predictions)
    20     : kernel_(&k), regression_(&r)
     15  RegressionLocal::RegressionLocal(Regression& r,
     16                                   RegressionKernel& k)
     17    : kernel_(&k), regressor_(&r)
    2118  {
    22     estimated_x_ = gslapi::vector(nof_predictions);
    23     estimated_y_ = estimated_x_;
    24     estimated_y_err_ = estimated_x_;
    25     //sorting data with respect to x
    26     // Peter, could this be done without all the copying
    27     std::vector<std::pair<double, double> > data;
    28     for (size_t i=0; i<x.size(); i++){
    29       std::pair<double, double> tmp(x(i),y(i));
    30       data_.push_back(tmp);
    31     }
    32     sort(data_.begin(), data_.end());
    33     for (size_t i=0; i<nof_predictions; i++)
    34       estimated_x_(i) =
    35         data_[static_cast<size_t>((i+0.5)/nof_predictions*data_.size())].first;
    3619  }
    3720
    38   void RegressionLocal::fit(const double f)
     21  void RegressionLocal::fit(const double f, const u_int step_size)
    3922  {
     23    sort(data_.begin(), data_.end());
     24
    4025    // number of points on each side
    41     size_t nof_data_points = static_cast<size_t>(f/2*data_.size());
    42     size_t index_min = 0;
    43     size_t index_max = 0;
    44     for (size_t i=0; i<estimated_x_.size(); i++) {
     26    size_t nof_points = static_cast<size_t>(f*data_.size());
     27    double width = 0;
     28    int min_index = 0;
     29    for (size_t i=0; i<data_.size(); i+=step_size) {
     30      x_.push_back(data_[i].first);
     31     
     32      // determining boundaries window/kernel
     33     
    4534      // extreme left case
    46       if (data_[nof_data_points-1].first>estimated_x_(i)){
    47         index_min = 0;
    48         index_max = 2*nof_data_points-1;
     35      if (data_[i].first <
     36          (data_[nof_points-1].first+data_[nof_points-1].first)/2 ){
     37        min_index=0;
     38        width = data_[nof_points-1].first-data_[i].first;
    4939      }
    50      
    5140      // extreme right case
    52       else if (data_[data_.size()-estimated_x_.size()-1].first<
    53                estimated_x_(i)){
    54         index_min = data_.size()-2*nof_data_points;
    55         index_max = data_.size()-1;
     41      else if (data_[i].first > (data_[data_.size()-1].first+
     42                            data_[data_.size()-nof_points].first)/2 ){
     43        min_index = data_.size() - nof_points;
     44        width = data_[i].first - data_[data_.size()-nof_points].first;
    5645      }
    57      
    58       // normal case - window in the middle
    5946      else {
    60         for (size_t j=nof_data_points; j<data_.size(); j++)
    61           if (data_[j].first>estimated_x_(i)) {
    62             index_min = j-nof_data_points;
    63             index_max = j+nof_data_points-1;
    64             break;
    65           }
     47        // stepping forward until x is in the middle
     48        while(data_[min_index+nof_points-1].first-data_[i].first
     49              < data_[i].first-data_[min_index].first)
     50          min_index++;
     51        width = data_[min_index+nof_points-1].first-data_[i].first;
     52        // Peter, should check if x gets closer to centrum if we step
     53        // back one step
    6654      }
    67      
     55
     56
    6857      // copying data
    69       // Peter, this is a stupid solution which could be
    70       // improved by using a moving view (in the vector class).
    71       gslapi::vector x(index_max-index_min+1);
    72       gslapi::vector y(index_max-index_min+1);
    73       gslapi::vector w(index_max-index_min+1);
     58      // Peter, too much copying. Move the copying outside loop and
     59      // use a vector view (when available in gslapi::vector class).
     60      gslapi::vector x(nof_points);
     61      gslapi::vector y(nof_points);
     62      gslapi::vector w(nof_points);
    7463      for (size_t j=0; j<x.size(); j++)
    75         x(j)=data_[index_min+j].first;
     64        x(j)=data_[min_index+j].first;
    7665      for (size_t j=0; j<y.size(); j++){
    77         y(j)=data_[index_min+j].second;
    78         if (y(j)>10)
    79           std::cout << x(j) << "\t" << y(j) << std::endl;
     66        y(j)=data_[min_index+j].second;
    8067      }
    8168      // calculating weights
    8269      for (size_t j=0; j<y.size(); j++)
    83         w(j) = kernel_->weight( 2*(x(j)-data_[index_min].first)/
    84                                 (data_[index_max].first-
    85                                  data_[index_min].first)-1);
    86 
     70        w(j) = kernel_->weight( (x(j)-(data_[min_index].first+
     71                                       data_[min_index+nof_points-1].first) /2)
     72                                /width );
    8773     
    8874      // fitting the regressor locally
    89       std::cout << "x: " << estimated_x_(i) << std::endl;
    90       std::cout << "x.begin: " << x(0) << std::endl;
    91       std::cout << "x.end: " << x(x.size()-1) << std::endl;
    92       regression_->fit(x,y,w);
    93       std::cout << "estimating value\n";
    94       regression_->predict(estimated_x_(i),
    95                             estimated_y_(i),
    96                             estimated_y_err_(i));
     75      regressor_->fit(x,y,w);
     76      regressor_->predict(x_[i], y_[i], y_err_[i]);
    9777    }
    9878  }
    99  
    100   std::ostream& operator<< (std::ostream& s, const RegressionLocal& r)
     79
     80  std::ostream& RegressionLocal::print(std::ostream& s) const
    10181  {
    102     gslapi::vector x=r.estimated_x();
    103     gslapi::vector y(r.estimated_y());
    104     gslapi::vector y_err(r.estimated_y_err());
    105     for (size_t i=0; i<x.size(); i++){
    106       s << x(i) << "\t";
    107       s << y(i) << "\t";
    108       s << y_err(i) << "\n";
     82    for (size_t i=0; i<x_.size(); i++) {
     83      regressor_->print(s);
     84      s << std::endl;
    10985    }
    11086    return s;
    11187  }
    11288
     89
    11390}} // of namespace cpptools and namespace theplu
Note: See TracChangeset for help on using the changeset viewer.