yat/statistics/GaussianMixture.h

Code
Comments
Other
Rev Date Author Line
3644 11 May 17 peter 1 #ifndef _theplu_yat_statistics_gaussian_mixture_
3644 11 May 17 peter 2 #define _theplu_yat_statistics_gaussian_mixture_
3644 11 May 17 peter 3
3644 11 May 17 peter 4 // $Id$
3644 11 May 17 peter 5
3644 11 May 17 peter 6 /*
4207 26 Aug 22 peter 7   Copyright (C) 2017, 2022 Peter Johansson
3644 11 May 17 peter 8
3644 11 May 17 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
3644 11 May 17 peter 10
3644 11 May 17 peter 11   The yat library is free software; you can redistribute it and/or
3644 11 May 17 peter 12   modify it under the terms of the GNU General Public License as
3644 11 May 17 peter 13   published by the Free Software Foundation; either version 3 of the
3644 11 May 17 peter 14   License, or (at your option) any later version.
3644 11 May 17 peter 15
3644 11 May 17 peter 16   The yat library is distributed in the hope that it will be useful,
3644 11 May 17 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
3644 11 May 17 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3644 11 May 17 peter 19   General Public License for more details.
3644 11 May 17 peter 20
3644 11 May 17 peter 21   You should have received a copy of the GNU General Public License
3644 11 May 17 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
3644 11 May 17 peter 23 */
3644 11 May 17 peter 24
3644 11 May 17 peter 25 #include <yat/utility/Vector.h>
3644 11 May 17 peter 26
3644 11 May 17 peter 27 #include <cstddef>
3644 11 May 17 peter 28 #include <vector>
3644 11 May 17 peter 29
3644 11 May 17 peter 30 namespace theplu {
3644 11 May 17 peter 31 namespace yat {
3644 11 May 17 peter 32 namespace utility {
3644 11 May 17 peter 33   class Matrix;
3644 11 May 17 peter 34 }
3644 11 May 17 peter 35 namespace statistics {
3644 11 May 17 peter 36
3644 11 May 17 peter 37   /**
3644 11 May 17 peter 38      \brief Data modelled as mixture of Gaussian distributions.
3644 11 May 17 peter 39
3644 11 May 17 peter 40      Data are modelled as
3644 11 May 17 peter 41      \f$ P(x) = \sum_i^n \alpha_i \mathcal{N}(m_i, \sigma_i) \f$
3644 11 May 17 peter 42
3644 11 May 17 peter 43      \since New in yat 0.15
3644 11 May 17 peter 44   */
3644 11 May 17 peter 45   class GaussianMixture
3644 11 May 17 peter 46   {
3644 11 May 17 peter 47   public:
3644 11 May 17 peter 48     /**
3644 11 May 17 peter 49        add \a n data points of value \a x
3644 11 May 17 peter 50      */
3644 11 May 17 peter 51     void add(double x, unsigned long int n=1);
3644 11 May 17 peter 52
3644 11 May 17 peter 53     /**
3644 11 May 17 peter 54        \return alpha from ith gaussian
3644 11 May 17 peter 55      */
3644 11 May 17 peter 56     double alpha(size_t i) const;
3644 11 May 17 peter 57
3644 11 May 17 peter 58     /**
3644 11 May 17 peter 59        \return Cumulative probability that \f$ X \le x \f$
3644 11 May 17 peter 60     */
3644 11 May 17 peter 61     double cdf_P(double x) const;
3644 11 May 17 peter 62
3644 11 May 17 peter 63     /**
3644 11 May 17 peter 64        \brief Clear all data
3644 11 May 17 peter 65      */
3644 11 May 17 peter 66     void clear(void);
3644 11 May 17 peter 67
3644 11 May 17 peter 68     /**
3644 11 May 17 peter 69        \brief fit the model
3644 11 May 17 peter 70
3644 11 May 17 peter 71        \param n number of gaussians in model
3644 11 May 17 peter 72      */
3644 11 May 17 peter 73     void fit(size_t n);
3644 11 May 17 peter 74
3644 11 May 17 peter 75     /**
4150 07 Mar 22 peter 76        Fit the model usng the passed variables as initial parameters
4150 07 Mar 22 peter 77        in the search.
4150 07 Mar 22 peter 78
4150 07 Mar 22 peter 79        \since New in yat 0.20
4150 07 Mar 22 peter 80      */
4150 07 Mar 22 peter 81     void fit(const utility::Vector& alpha, const utility::Vector& mean,
4150 07 Mar 22 peter 82              const utility::Vector& sigma);
4150 07 Mar 22 peter 83
4150 07 Mar 22 peter 84     /**
3644 11 May 17 peter 85        \return mean
3644 11 May 17 peter 86      */
3644 11 May 17 peter 87     double mean(void) const;
3644 11 May 17 peter 88
3644 11 May 17 peter 89     /**
3644 11 May 17 peter 90        \return mean of ith gaussian
3644 11 May 17 peter 91      */
3644 11 May 17 peter 92     double mean(size_t i) const;
3644 11 May 17 peter 93
3644 11 May 17 peter 94     /**
3644 11 May 17 peter 95        \return Value at x for probability densisty function
3644 11 May 17 peter 96      */
3644 11 May 17 peter 97     double pdf(double x) const;
3644 11 May 17 peter 98
3644 11 May 17 peter 99     /**
3644 11 May 17 peter 100        \return standard deviation of ith gaussian
3644 11 May 17 peter 101      */
3644 11 May 17 peter 102     double std(size_t i) const;
3644 11 May 17 peter 103
3644 11 May 17 peter 104   private:
3644 11 May 17 peter 105     struct data_type
3644 11 May 17 peter 106     {
3644 11 May 17 peter 107       data_type(double x, unsigned long int n);
3644 11 May 17 peter 108       double x;
3644 11 May 17 peter 109       unsigned long int n;
3644 11 May 17 peter 110     };
3644 11 May 17 peter 111     std::vector<data_type> data_;
3644 11 May 17 peter 112
3644 11 May 17 peter 113     utility::Vector alpha_;
3644 11 May 17 peter 114     utility::Vector mean_;
3644 11 May 17 peter 115     utility::Vector sigma_;
3644 11 May 17 peter 116
3644 11 May 17 peter 117     void calculate_posterior(utility::Matrix& h) const;
4150 07 Mar 22 peter 118     void fit(void);
3644 11 May 17 peter 119     void update_model(const utility::Matrix& h);
3644 11 May 17 peter 120    };
3644 11 May 17 peter 121
3644 11 May 17 peter 122 }}} // of namespace statistics, yat, and theplu
3644 11 May 17 peter 123
3644 11 May 17 peter 124 #endif