Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef OPENMS_MATH_STATISTICS_BASICSTATISTICS_H
00036 #define OPENMS_MATH_STATISTICS_BASICSTATISTICS_H
00037
00038 #include <OpenMS/CONCEPT/Types.h>
00039 #include <vector>
00040 #include <ostream>
00041 #include <cmath>
00042 #include <numeric>
00043
00044 namespace OpenMS
00045 {
00046 namespace Math
00047 {
00048
00067 template <typename RealT = DoubleReal>
00068 class
00069 BasicStatistics
00070 {
00071
00072 public:
00073
00075 typedef RealT RealType;
00076
00077 typedef std::vector<RealType> probability_container;
00078 typedef std::vector<RealType> coordinate_container;
00079
00081 BasicStatistics() :
00082 mean_(0),
00083 variance_(0),
00084 sum_(0)
00085 {}
00086
00088 BasicStatistics(BasicStatistics const & arg) :
00089 mean_(arg.mean_),
00090 variance_(arg.variance_),
00091 sum_(arg.sum_)
00092 {}
00093
00095 BasicStatistics & operator=(BasicStatistics const & arg)
00096 {
00097 mean_ = arg.mean_;
00098 variance_ = arg.variance_;
00099 sum_ = arg.sum_;
00100 return *this;
00101 }
00102
00104 void clear()
00105 {
00106 mean_ = 0;
00107 variance_ = 0;
00108 sum_ = 0;
00109 }
00110
00112
00113 template <typename ProbabilityIterator>
00114 void update(ProbabilityIterator probability_begin,
00115 ProbabilityIterator const probability_end
00116 )
00117 {
00118 clear();
00119 unsigned pos = 0;
00120 ProbabilityIterator iter = probability_begin;
00121
00122 for (; iter != probability_end; ++iter, ++pos)
00123 {
00124 sum_ += *iter;
00125 mean_ += *iter * pos;
00126 }
00127 mean_ /= sum_;
00128
00129 for (iter = probability_begin, pos = 0; iter != probability_end; ++iter, ++pos)
00130 {
00131 RealType diff = RealType(pos) - mean_;
00132 diff *= diff;
00133 variance_ += *iter * diff;
00134 }
00135 variance_ /= sum_;
00136 }
00137
00139
00140 template <typename ProbabilityIterator, typename CoordinateIterator>
00141 void update(ProbabilityIterator const probability_begin,
00142 ProbabilityIterator const probability_end,
00143 CoordinateIterator const coordinate_begin
00144 )
00145 {
00146 clear();
00147 ProbabilityIterator prob_iter = probability_begin;
00148 CoordinateIterator coord_iter = coordinate_begin;
00149
00150 for (; prob_iter != probability_end; ++prob_iter, ++coord_iter)
00151 {
00152 sum_ += *prob_iter;
00153 mean_ += *prob_iter * *coord_iter;
00154 }
00155 mean_ /= sum_;
00156
00157 for (prob_iter = probability_begin, coord_iter = coordinate_begin;
00158 prob_iter != probability_end;
00159 ++prob_iter, ++coord_iter
00160 )
00161 {
00162 RealType diff = *coord_iter - mean_;
00163 diff *= diff;
00164 variance_ += *prob_iter * diff;
00165 }
00166 variance_ /= sum_;
00167 return;
00168 }
00169
00171 RealType mean() const { return mean_; }
00172 void setMean(RealType const & mean) { mean_ = mean; }
00173
00175 RealType variance() const { return variance_; }
00176 void setVariance(RealType const & variance) { variance_ = variance; }
00177
00179 RealType sum() const { return sum_; }
00180 void setSum(RealType const & sum) { sum_ = sum; }
00181
00182
00187 RealType normalDensity_sqrt2pi(RealType coordinate) const
00188 {
00189 coordinate -= mean();
00190 coordinate *= coordinate;
00191 return exp(-coordinate / RealType(2) / variance());
00192 }
00193
00195 static RealType sqrt2pi() { return 2.50662827463100050240; }
00196
00200 inline RealType normalDensity(RealType const coordinate) const
00201 {
00202 return normalDensity_sqrt2pi(coordinate) / sqrt2pi();
00203 }
00204
00209 void normalApproximation(probability_container & probability)
00210 {
00211 normalApproximationHelper_(probability, probability.size());
00212 return;
00213 }
00214
00219 void normalApproximation(probability_container & probability,
00220 typename probability_container::size_type const size
00221 )
00222 {
00223 probability.resize(size);
00224 normalApproximationHelper_(probability, size);
00225 return;
00226 }
00227
00233 void normalApproximation(probability_container & probability,
00234 coordinate_container const & coordinate
00235 )
00236 {
00237 probability.resize(coordinate.size());
00238 normalApproximationHelper_(probability, coordinate);
00239 return;
00240 }
00241
00246 friend std::ostream & operator<<(std::ostream & os, BasicStatistics & arg)
00247 {
00248 os << "BasicStatistics: mean=" << arg.mean() << " variance=" << arg.variance() << " sum=" << arg.sum();
00249 return os;
00250 }
00251
00252 protected:
00253
00255
00256
00257 RealType mean_;
00258 RealType variance_;
00259 RealType sum_;
00260
00261 private:
00263
00265
00266
00267 void normalApproximationHelper_(probability_container & probability,
00268 typename probability_container::size_type const size
00269 )
00270 {
00271 RealType gaussSum = 0;
00272 typename coordinate_container::size_type i;
00273
00274
00275 for (i = 0; i < size; ++i)
00276 {
00277 gaussSum += normalDensity_sqrt2pi(RealType(i));
00278 }
00279
00280 for (i = 0; i < size; ++i)
00281 {
00282 probability[i] = normalDensity_sqrt2pi(RealType(i)) / gaussSum * sum();
00283 }
00284 return;
00285 }
00286
00287 void normalApproximationHelper_(probability_container & probability,
00288 coordinate_container const & coordinate
00289 )
00290 {
00291 RealType gaussSum = 0;
00292 typename coordinate_container::size_type i;
00293 typename coordinate_container::size_type const size = coordinate.size();
00294
00295 for (i = 0; i < size; ++i)
00296 {
00297 gaussSum += normalDensity_sqrt2pi(coordinate[i]);
00298 }
00299
00300 for (i = 0; i < size; ++i)
00301 {
00302 probability[i] = normalDensity_sqrt2pi(coordinate[i]) / gaussSum * sum();
00303 }
00304 return;
00305 }
00306
00308
00309 };
00310
00311 }
00312
00313 }
00314
00315 #endif // OPENMS_MATH_STATISTICS_BASICSTATISTICS_H