Home  · Classes  · Annotated Classes  · Modules  · Members  · Namespaces  · Related Pages

BasicStatistics.h

Go to the documentation of this file.
00001 // --------------------------------------------------------------------------
00002 //                   OpenMS -- Open-Source Mass Spectrometry
00003 // --------------------------------------------------------------------------
00004 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
00005 // ETH Zurich, and Freie Universitaet Berlin 2002-2012.
00006 //
00007 // This software is released under a three-clause BSD license:
00008 //  * Redistributions of source code must retain the above copyright
00009 //    notice, this list of conditions and the following disclaimer.
00010 //  * Redistributions in binary form must reproduce the above copyright
00011 //    notice, this list of conditions and the following disclaimer in the
00012 //    documentation and/or other materials provided with the distribution.
00013 //  * Neither the name of any author or any participating institution
00014 //    may be used to endorse or promote products derived from this software
00015 //    without specific prior written permission.
00016 // For a full list of authors, refer to the file AUTHORS.
00017 // --------------------------------------------------------------------------
00018 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00019 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
00022 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00023 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00024 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
00025 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
00026 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
00027 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
00028 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029 //
00030 // --------------------------------------------------------------------------
00031 // $Maintainer: Clemens Groepl $
00032 // $Authors: $
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         // precondition size == probability.size() is guaranteed by wrappers.
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   }   // namespace Math
00312 
00313 } // namespace OpenMS
00314 
00315 #endif // OPENMS_MATH_STATISTICS_BASICSTATISTICS_H

OpenMS / TOPP release 1.10.0 Documentation generated on Thu Mar 7 2013 09:42:37 using doxygen 1.7.1