yat  0.21pre
Zscore.h
1 #ifndef _theplu_yat_normalizer_z_score_
2 #define _theplu_yat_normalizer_z_score_
3 
4 // $Id: Zscore.h 4089 2021-09-07 00:56:40Z peter $
5 
6 /*
7  Copyright (C) 2008 Jari Häkkinen, Peter Johansson
8  Copyright (C) 2009, 2010, 2016, 2021 Peter Johansson
9 
10  This file is part of the yat library, http://dev.thep.lu.se/yat
11 
12  The yat library is free software; you can redistribute it and/or
13  modify it under the terms of the GNU General Public License as
14  published by the Free Software Foundation; either version 3 of the
15  License, or (at your option) any later version.
16 
17  The yat library is distributed in the hope that it will be useful,
18  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  General Public License for more details.
21 
22  You should have received a copy of the GNU General Public License
23  along with yat. If not, see <http://www.gnu.org/licenses/>.
24 */
25 
26 #include "utility.h"
27 
28 #include "yat/statistics/Averager.h"
29 #include "yat/statistics/AveragerWeighted.h"
30 
31 #include "yat/utility/concept_check.h"
32 #include "yat/utility/iterator_traits.h"
33 
34 #include <boost/concept_check.hpp>
35 
36 namespace theplu {
37 namespace yat {
38 namespace normalizer {
39 
57  class Zscore
58  {
59  public:
66  explicit Zscore(double k=1.0);
67 
73  double k(void) const;
74 
85  template<class InputIterator, class OutputIterator>
86  void operator()(InputIterator first, InputIterator last,
87  OutputIterator result) const
88  {
89  BOOST_CONCEPT_ASSERT((utility::DataIteratorConcept<InputIterator>));
90  BOOST_CONCEPT_ASSERT((utility::DataIteratorConcept<OutputIterator>));
91 
92  // needed for weighted_if_any2
94  normalize(first, last, result, tag);
95  }
96 
97  private:
98  double k_;
99 
100 
101  template<class ForwardIterator, class OutputIterator>
102  void normalize(ForwardIterator first, ForwardIterator last,
103  OutputIterator result,
105  {
106  // we need to traverse the input range once in calculating m
107  // (and std) and a second time when assigning new values, so
108  // single pass iterator will not suffice.
109  BOOST_CONCEPT_ASSERT((boost_concepts::ForwardTraversal<ForwardIterator>));
110 
111  BOOST_CONCEPT_ASSERT((boost_concepts::WritableIterator<OutputIterator>));
112 
114  add(a, first, last);
115  double m = a.mean();
116  double factor = 1.0 / (a.std() * k_);
117  while (first!=last) {
118  *result = (*first - m) * factor;
119  ++first;
120  ++result;
121  }
122  }
123 
124  template<class ForwardIterator, class OutputIterator>
125  void normalize(ForwardIterator first, ForwardIterator last,
126  OutputIterator result,
127  utility::weighted_iterator_tag tag) const
128  {
129  // we need to traverse the input range once in calculating m
130  // (and std) and a second time when assigning new values, so
131  // single pass iterator will not suffice.
132  BOOST_CONCEPT_ASSERT((boost_concepts::ForwardTraversal<ForwardIterator>));
133 
134  BOOST_CONCEPT_ASSERT((boost_concepts::WritableIterator<OutputIterator>));
135  // we traverse output range twice
136  BOOST_CONCEPT_ASSERT((boost_concepts::ForwardTraversal<OutputIterator>));
137  detail::copy_weight_if_weighted(first, last, result);
138  statistics::AveragerWeighted a;
139  add(a, first, last);
140  double m = a.mean();
141  double factor = 1.0 / (a.std() * k_);
142  utility::iterator_traits<ForwardIterator> in_trait;
143  utility::iterator_traits<OutputIterator> out_trait;
144  while (first!=last) {
145  out_trait.data(result) = (in_trait.data(first) - m) * factor;
146  ++first;
147  ++result;
148  }
149  }
150  };
151 
152 }}} // end of namespace normalizer, yat and thep
153 #endif
Zero mean and unity variance.
Definition: Zscore.h:57
Concept check for Data Iterator.
Definition: concept_check.h:240
double std(void) const
The standard deviation is defined as the square root of the variance.
Definition: averager_base.h:206
Class to calculate simple (first and second moments) averages.
Definition: Averager.h:46
The Department of Theoretical Physics namespace as we define it.
Definition: iterator_traits.h:47
void operator()(InputIterator first, InputIterator last, OutputIterator result) const
Definition: Zscore.h:86
double mean(void) const
mean
Definition: averager_base.h:97
detail::unweighted_type_and< w_type1, w_type2 >::type type
return unweighted if both are unweighted
Definition: iterator_traits.h:165

Generated on Wed Jan 25 2023 03:34:29 for yat by  doxygen 1.8.14