00001 #ifndef _theplu_yat_normalizer_z_score_
00002 #define _theplu_yat_normalizer_z_score_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "yat/statistics/Averager.h"
00027 #include "yat/statistics/AveragerWeighted.h"
00028
00029 #include "yat/utility/iterator_traits.h"
00030
00031 namespace theplu {
00032 namespace yat {
00033 namespace normalizer {
00034
00045 class Zscore
00046 {
00047 public:
00058 template<class InputIterator, class OutputIterator>
00059 void operator()(InputIterator first, InputIterator last,
00060 OutputIterator result) const
00061 {
00062 typename utility::weighted_iterator_traits<InputIterator>::type tag;
00063 normalize(first, last, result, tag);
00064 }
00065
00066 private:
00067 template<class InputIterator, class OutputIterator>
00068 void normalize(InputIterator first,InputIterator last,OutputIterator result,
00069 utility::unweighted_iterator_tag tag) const
00070 {
00071 statistics::Averager a;
00072 add(a, first, last);
00073 double m = a.mean();
00074 double std = a.std();
00075 while (first!=last) {
00076 *result = (*first - m) / std;
00077 ++first;
00078 ++result;
00079 }
00080 }
00081
00082 template<class InputIterator, class OutputIterator>
00083 void normalize(InputIterator first,InputIterator last,OutputIterator result,
00084 utility::weighted_iterator_tag tag) const
00085 {
00086 std::copy(utility::weight_iterator(first),
00087 utility::weight_iterator(last),
00088 utility::weight_iterator(result));
00089 statistics::AveragerWeighted a;
00090 add(a, first, last);
00091 double m = a.mean();
00092 double std = a.std();
00093 utility::iterator_traits<InputIterator> trait;
00094 while (first!=last) {
00095 trait.data(result) = (trait.data(first) - m) / std;
00096 ++first;
00097 ++result;
00098 }
00099 }
00100 };
00101
00102 }}}
00103 #endif