RandLib 2.0.0
Probability distributions, fitting, and heavy-tail tools for C++20
Loading...
Searching...
No Matches
bayes.hpp
Go to the documentation of this file.
1#pragma once
2
17
18#include <concepts>
19#include <ranges>
20#include <span>
21#include <type_traits>
22
23#if defined(__clang__)
24#pragma clang diagnostic push
25#pragma clang diagnostic ignored "-Wdeprecated-declarations"
26#elif defined(__GNUC__)
27#pragma GCC diagnostic push
28#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
29#elif defined(_MSC_VER)
30#pragma warning(push)
31#pragma warning(disable : 4996)
32#endif
33
34namespace randlib
35{
36
37namespace detail
38{
39
40template <class Distribution, class Prior>
42
43template <class Distribution, class Prior>
45
46template <class Distribution, class Prior>
47concept ConjugateModel = requires(std::span<const typename Distribution::value_type> sample, const Prior &prior) {
48 BayesModel<Distribution, Prior>::posterior(sample, prior);
49};
50
51template <class Distribution, class Prior, class Fixed>
53 requires(std::span<const typename Distribution::value_type> sample, const Prior &prior, Fixed fixed) {
54 ConditionalBayesModel<Distribution, Prior>::posterior(sample, prior, fixed);
55 };
56
57template <std::floating_point Real>
59{
60 static NormalInverseGammaRand<Real> posterior(std::span<const Real> sample,
62 {
63 NormalRand<Real> distribution;
64 return distribution.FitBayes(sample, prior);
65 }
66};
67
68template <std::floating_point Real>
70{
71 static NormalInverseGammaRand<Real> posterior(std::span<const Real> sample,
73 {
74 LogNormalRand<Real> distribution;
75 return distribution.FitBayes(sample, prior);
76 }
77};
78
79template <std::floating_point Real>
81{
82 static GammaRand<Real> posterior(std::span<const Real> sample, const GammaRand<Real> &prior)
83 {
84 ExponentialRand<Real> distribution;
85 return distribution.FitRateBayes(sample, prior);
86 }
87};
88
89template <std::integral Int>
91{
92 static GammaRand<double> posterior(std::span<const Int> sample, const GammaRand<double> &prior)
93 {
94 PoissonRand<Int> distribution;
95 return distribution.FitBayes(sample, prior);
96 }
97};
98
99template <std::floating_point Real>
101{
102 static NormalRand<Real> posterior(std::span<const Real> sample, const NormalRand<Real> &prior, double variance)
103 {
104 NormalRand<Real> distribution(0, variance);
105 return distribution.FitLocationBayes(sample, prior);
106 }
107};
108
109template <std::floating_point Real>
111{
112 static InverseGammaRand<Real> posterior(std::span<const Real> sample, const InverseGammaRand<Real> &prior,
113 double location)
114 {
115 NormalRand<Real> distribution(location, 1);
116 return distribution.FitVarianceBayes(sample, prior);
117 }
118};
119
120template <std::floating_point Real>
122{
123 static NormalRand<Real> posterior(std::span<const Real> sample, const NormalRand<Real> &prior, double variance)
124 {
125 LogNormalRand<Real> distribution(0, variance);
126 return distribution.FitLocationBayes(sample, prior);
127 }
128};
129
130template <std::floating_point Real>
132{
133 static InverseGammaRand<Real> posterior(std::span<const Real> sample, const InverseGammaRand<Real> &prior,
134 double location)
135 {
136 LogNormalRand<Real> distribution(location, 1);
137 return distribution.FitScaleBayes(sample, prior);
138 }
139};
140
141template <std::integral Int>
143{
144 static BetaRand<double> posterior(std::span<const Int> sample, const BetaRand<double> &prior, int number)
145 {
146 BinomialRand<Int> distribution(number);
147 return distribution.FitProbabilityBayes(sample, prior);
148 }
149};
150
151template <std::integral Int, class Shape>
153{
154 static BetaRand<double> posterior(std::span<const Int> sample, const BetaRand<double> &prior, Shape number)
155 {
157 return distribution.FitProbabilityBayes(sample, prior);
158 }
159};
160
161template <std::floating_point Real>
163{
164 static InverseGammaRand<Real> posterior(std::span<const Real> sample, const InverseGammaRand<Real> &prior,
165 double shape)
166 {
167 WeibullRand<Real> distribution(1, shape);
168 return distribution.FitScaleBayes(sample, prior);
169 }
170};
171
172template <std::floating_point Real>
174{
175 static GammaRand<Real> posterior(std::span<const Real> sample, const GammaRand<Real> &prior, double scale)
176 {
177 ParetoRand<Real> distribution(1, scale);
178 return distribution.FitShapeBayes(sample, prior);
179 }
180};
181
182template <std::floating_point Real>
184{
185 static ParetoRand<Real> posterior(std::span<const Real> sample, const ParetoRand<Real> &prior, double minimum)
186 {
187 UniformRand<Real> distribution(minimum, minimum + 1);
188 return distribution.FitMaximumBayes(sample, prior);
189 }
190};
191
192} // namespace detail
193
194template <class Distribution, class Prior>
196auto fit_bayes(std::span<const typename Distribution::value_type> sample, const Prior &prior)
197{
198 if (sample.empty())
199 throw fit_error(FitErrorCode::TooFewElements, "Bayesian fitting requires a non-empty sample");
201}
202
203template <class Distribution, std::ranges::contiguous_range Range, class Prior>
204 requires std::same_as<std::remove_cv_t<std::ranges::range_value_t<Range>>, typename Distribution::value_type> &&
206auto fit_bayes(const Range &sample, const Prior &prior)
207{
208 return fit_bayes<Distribution>(std::span<const typename Distribution::value_type>(sample), prior);
209}
210
211template <class Distribution, std::ranges::contiguous_range Range, class Prior, class Fixed>
212 requires std::same_as<std::remove_cv_t<std::ranges::range_value_t<Range>>, typename Distribution::value_type> &&
214auto fit_bayes(const Range &sample, const Prior &prior, Fixed fixed)
215{
216 if (std::ranges::empty(sample))
217 throw fit_error(FitErrorCode::TooFewElements, "Bayesian fitting requires a non-empty sample");
219 std::span<const typename Distribution::value_type>(sample), prior, fixed);
220}
221
222template <std::ranges::contiguous_range Range, std::floating_point Real>
223 requires std::same_as<std::remove_cv_t<std::ranges::range_value_t<Range>>, Real>
224auto fit_bayes(const Range &sample, const NormalInverseGammaRand<Real> &prior)
225{
226 return fit_bayes<NormalRand<Real>>(sample, prior);
227}
228
229template <std::ranges::contiguous_range Range, std::floating_point Real>
230 requires std::same_as<std::remove_cv_t<std::ranges::range_value_t<Range>>, Real>
231auto fit_bayes(const Range &sample, const GammaRand<Real> &prior)
232{
233 return fit_bayes<ExponentialRand<Real>>(sample, prior);
234}
235
236template <std::ranges::contiguous_range Range>
237 requires std::integral<std::remove_cv_t<std::ranges::range_value_t<Range>>>
238auto fit_bayes(const Range &sample, const GammaRand<double> &prior)
239{
240 using Int = std::remove_cv_t<std::ranges::range_value_t<Range>>;
241 return fit_bayes<PoissonRand<Int>>(sample, prior);
242}
243
244} // namespace randlib
245
246#if defined(__clang__)
247#pragma clang diagnostic pop
248#elif defined(__GNUC__)
249#pragma GCC diagnostic pop
250#elif defined(_MSC_VER)
251#pragma warning(pop)
252#endif
The BetaRand class Beta distribution.
Definition continuous/beta.hpp:246
BetaRand FitProbabilityBayes(std::span< const IntType > sample, const BetaDistribution<> &priorDistribution, bool MAP=false)
Fit probability p with prior assumption p ~ Beta(α, β)
Definition binomial.hpp:732
The BinomialRand class Binomial distribution.
Definition binomial.hpp:197
The ExponentialRand class Exponential distribution.
Definition exponential.hpp:28
GammaRand< RealType > FitRateBayes(std::span< const RealType > sample, const GammaDistribution< RealType > &priorDistribution, bool MAP=false)
set rate, returned by bayesian estimation
Definition continuous/gamma.hpp:934
The GammaRand class Gamma distribution.
Definition continuous/gamma.hpp:295
The InverseGammaRand class Inverse-Gamma distribution.
Definition inverse_gamma.hpp:23
The LogNormalRand class Log-Normal distribution.
Definition log_normal.hpp:25
InverseGammaRand< RealType > FitScaleBayes(std::span< const RealType > sample, const InverseGammaRand< RealType > &priorDistribution, bool MAP=false)
Set scale, using bayesian inference.
Definition log_normal.hpp:374
NormalInverseGammaRand< RealType > FitBayes(std::span< const RealType > sample, const NormalInverseGammaRand< RealType > &priorDistribution, bool MAP=false)
Set parameters, using bayesian inference.
Definition log_normal.hpp:394
NormalRand< RealType > FitLocationBayes(std::span< const RealType > sample, const NormalRand< RealType > &priorDistribution, bool MAP=false)
Set location, using bayesian inference.
Definition log_normal.hpp:356
BetaRand FitProbabilityBayes(std::span< const IntType > sample, const BetaDistribution<> &priorDistribution, bool MAP=false)
Definition negative_binomial.hpp:390
The NegativeBinomialRand class Negative binomial distribution.
Definition negative_binomial.hpp:133
The NormalInverseGammaRand class Normal-inverse-gamma distribution.
Definition normal_inverse_gamma.hpp:24
The NormalRand class Normal distribution.
Definition normal.hpp:31
NormalInverseGammaRand< RealType > FitBayes(std::span< const RealType > sample, const NormalInverseGammaRand< RealType > &priorDistribution, bool MAP=false)
set parameters, returned by bayesian estimation
Definition normal.hpp:494
NormalRand< RealType > FitLocationBayes(std::span< const RealType > sample, const NormalRand< RealType > &priorDistribution, bool MAP=false)
set location, returned by bayesian estimation
Definition normal.hpp:464
InverseGammaRand< RealType > FitVarianceBayes(std::span< const RealType > sample, const InverseGammaRand< RealType > &priorDistribution, bool MAP=false)
set variance, returned by bayesian estimation
Definition normal.hpp:478
The ParetoRand class Pareto distribution.
Definition pareto.hpp:24
GammaRand< RealType > FitShapeBayes(std::span< const RealType > sample, const GammaDistribution< RealType > &priorDistribution, bool MAP=false)
Fit α, using bayesian inference.
Definition pareto.hpp:373
The PoissonRand class Poisson distribution.
Definition poisson.hpp:26
GammaRand FitBayes(std::span< const IntType > sample, const GammaDistribution<> &priorDistribution, bool MAP=false)
fit rate λ via Bayes estimation
Definition poisson.hpp:501
The UniformRand class Uniform continuous distribution.
Definition continuous/uniform.hpp:30
ParetoRand< RealType > FitMaximumBayes(std::span< const RealType > sample, const ParetoRand< RealType > &priorDistribution, bool MAP=false)
fit maximum parameter, using Bayesian estimation
Definition continuous/uniform.hpp:352
The WeibullRand class Weibull distribution.
Definition weibull.hpp:21
InverseGammaRand< RealType > FitScaleBayes(std::span< const RealType > sample, const InverseGammaRand< RealType > &priorDistribution, bool MAP=false)
Fit λ, using bayesian inference.
Definition weibull.hpp:345
The fit_error class Thrown when a distribution cannot be fitted to a sample; code() tells why.
Definition errors.hpp:36
Definition bayes.hpp:47
Real standardNormal(G &g)
Ziggurat algorithm of Marsaglia and Tsang with 256 layers and an explicit sign bit.
Definition variates.hpp:45
Definition bivariate_normal.hpp:10
@ TooFewElements
the sample is too small
auto fit_bayes(std::span< const typename Distribution::value_type > sample, const Prior &prior)
Definition bayes.hpp:196
static GammaRand< Real > posterior(std::span< const Real > sample, const GammaRand< Real > &prior)
Definition bayes.hpp:82
static NormalInverseGammaRand< Real > posterior(std::span< const Real > sample, const NormalInverseGammaRand< Real > &prior)
Definition bayes.hpp:71
static NormalInverseGammaRand< Real > posterior(std::span< const Real > sample, const NormalInverseGammaRand< Real > &prior)
Definition bayes.hpp:60
static GammaRand< double > posterior(std::span< const Int > sample, const GammaRand< double > &prior)
Definition bayes.hpp:92
Definition bayes.hpp:41
static BetaRand< double > posterior(std::span< const Int > sample, const BetaRand< double > &prior, int number)
Definition bayes.hpp:144
static InverseGammaRand< Real > posterior(std::span< const Real > sample, const InverseGammaRand< Real > &prior, double location)
Definition bayes.hpp:133
static NormalRand< Real > posterior(std::span< const Real > sample, const NormalRand< Real > &prior, double variance)
Definition bayes.hpp:123
static BetaRand< double > posterior(std::span< const Int > sample, const BetaRand< double > &prior, Shape number)
Definition bayes.hpp:154
static InverseGammaRand< Real > posterior(std::span< const Real > sample, const InverseGammaRand< Real > &prior, double location)
Definition bayes.hpp:112
static NormalRand< Real > posterior(std::span< const Real > sample, const NormalRand< Real > &prior, double variance)
Definition bayes.hpp:102
static GammaRand< Real > posterior(std::span< const Real > sample, const GammaRand< Real > &prior, double scale)
Definition bayes.hpp:175
static ParetoRand< Real > posterior(std::span< const Real > sample, const ParetoRand< Real > &prior, double minimum)
Definition bayes.hpp:185
static InverseGammaRand< Real > posterior(std::span< const Real > sample, const InverseGammaRand< Real > &prior, double shape)
Definition bayes.hpp:164