1 | // $Id: Local.cc 430 2005-12-08 22:53:08Z peter $ |
---|
2 | |
---|
3 | #include <c++_tools/statistics/Local.h> |
---|
4 | |
---|
5 | #include <c++_tools/gslapi/vector.h> |
---|
6 | #include <c++_tools/statistics/Kernel.h> |
---|
7 | #include <c++_tools/statistics/OneDimensionalWeighted.h> |
---|
8 | |
---|
9 | #include <algorithm> |
---|
10 | #include <iostream> |
---|
11 | |
---|
12 | namespace theplu { |
---|
13 | namespace statistics { |
---|
14 | namespace regression { |
---|
15 | |
---|
16 | |
---|
17 | void Local::fit(const double width, const gslapi::vector& points) |
---|
18 | { |
---|
19 | // Peter, avoid this copying |
---|
20 | x_=points; |
---|
21 | y_predicted_ = gslapi::vector(points.size()); |
---|
22 | y_err_ = gslapi::vector(points.size()); |
---|
23 | |
---|
24 | sort(data_.begin(), data_.end()); |
---|
25 | |
---|
26 | // coying data to 2 gslapi vectors ONCE to use views from |
---|
27 | gslapi::vector x(data_.size()); |
---|
28 | gslapi::vector y(data_.size()); |
---|
29 | for (size_t j=0; j<x.size(); j++) |
---|
30 | x(j)=data_[j].first; |
---|
31 | for (size_t j=0; j<y.size(); j++) |
---|
32 | y(j)=data_[j].second; |
---|
33 | |
---|
34 | size_t min_index = 0; |
---|
35 | size_t max_index = 1; |
---|
36 | |
---|
37 | for (size_t i=0; i<points.size(); i++) { |
---|
38 | |
---|
39 | while (points(min_index) < x(i)-width) |
---|
40 | min_index++; |
---|
41 | if (min_index) |
---|
42 | min_index--; |
---|
43 | while (points(max_index) < x(i)+width && max_index<points.size()-1) |
---|
44 | max_index++; |
---|
45 | |
---|
46 | gslapi::vector x_local(x, min_index, max_index-min_index+1); |
---|
47 | gslapi::vector y_local(y, min_index, max_index-min_index+1); |
---|
48 | |
---|
49 | // calculating weights |
---|
50 | gslapi::vector w(max_index-min_index+1); |
---|
51 | for (size_t j=0; j<y_local.size(); j++) |
---|
52 | w(j) = kernel_->weight( (x_local(j)- x(i))/width ); |
---|
53 | |
---|
54 | // fitting the regressor locally |
---|
55 | regressor_->fit(x_local,y_local,w); |
---|
56 | regressor_->predict(x(i), y_predicted_(i),y_err_(i)); |
---|
57 | } |
---|
58 | } |
---|
59 | |
---|
60 | std::ostream& operator<<(std::ostream& os, const Local& r) |
---|
61 | { |
---|
62 | os << "# column 1: x\n" |
---|
63 | << "# column 2: y\n" |
---|
64 | << "# column 3: y_err\n"; |
---|
65 | for (size_t i=0; i<r.x().size(); i++) { |
---|
66 | os << r.x()(i) << "\t" |
---|
67 | << r.y_predicted()(i) << "\t" |
---|
68 | << r.y_err()(i) << "\n"; |
---|
69 | } |
---|
70 | |
---|
71 | return os; |
---|
72 | } |
---|
73 | }}} // of namespaces regression, statisitcs and thep |
---|