Class TruncatedGaussian¶
Defined in File TruncatedGaussian.h
Class Documentation¶
-
class
TruncatedGaussian
¶ Represents a multidimensional Gaussian function truncated at zero.
This is typically used to represent the posterior probability of amplitude parameters, given a flat prior; we require that the amplitudes each be positive but otherwise do not modify the Gaussian likelihood.
Currently only 1 and 2 dimensions are supported, and all dimensions must be truncated. Computing integrals is the only operation for which > 2-d is not implemented, but the integrals must be computed upon construction, so we can’t support any other operations for > 2-d either.
Many operations on TruncatedGaussians are defined in -log space, as underflow/overflow problems will often occur in the non-log forms.
See modelfitTruncatedGaussianMath for implementation notes
Public Types
-
enum
SampleStrategy
¶ Enum that describes different ways of sampling from a multidimensional TruncatedGaussian.
Values:
-
DIRECT_WITH_REJECTION
¶ Draw from the untruncated Gaussian, and discard negative draws. This approach is fast for minimally-truncated Gaussians, and produces ideally distributed samples with unit weights (because we discard with replacement). This approach can be extremely inefficient when the untruncated fraction is small, and cannot be used when the Hessian matrix is singular (as this sets the untruncated fraction to zero).
-
ALIGN_AND_WEIGHT
¶ Create a similar Gaussian with no x-y covariance, and importance sample by drawing from the independent 1-d truncated Gaussians. This approach is faster for Gaussians that are heavily truncated, but it requires the use of per-sample weights and may produce “noisier” samples (in that regions with low weight may have many samples, while regions with high weight have few). It may also be slower for minimally truncated Gaussians because each 1-d variate requires an inverse erfc evaluation. In 1-d, this produces unit weights and ideally distributed samples, but still uses an inverse erfc approach rather than rejection to create samples.
-
-
typedef TruncatedGaussianSampler
Sampler
¶
-
typedef TruncatedGaussianLogEvaluator
LogEvaluator
¶
-
typedef TruncatedGaussianEvaluator
Evaluator
¶
Public Functions
-
TruncatedGaussian::Sampler
sample
(SampleStrategy strategy) const¶ Create a Sampler object that uses the given strategy.
- Warning
do not call this method with DIRECT_WITH_REJECTION unless you are certain the Gaussian is far from degenerate, as an endless loop may result in this case. It is generally safer to use the overload that selects the strategy automatically.
-
TruncatedGaussian::Sampler
sample
(Scalar minRejectionEfficiency = 0.1) const¶ Create a Sampler object that determines the strategy to use automatically.
If the efficiency (number of accepted samples divided by number of total samples) is would (on average) be greater than the given value, DIRECT_WITH_REJECTION is used. If not, ALIGN_AND_WEIGHT is used. Note that the sampling effeciency for DIRECT_WITH_REJECTION is exactly the same as the “untruncated fraction”.
-
TruncatedGaussian::LogEvaluator
evaluateLog
() const¶ Create a LogEvaluator object that can be used to efficiently evaluate the -log of the function.
-
TruncatedGaussian::Evaluator
evaluate
() const¶ Create an Evaluator object that can be used to efficiently evaluate the function.
-
int
getDim
() const¶ Return the dimensionality of the function.
-
Vector
maximize
() const¶ Return the location of the maximum of the truncated Gaussian.
This is simply the untruncated location parameter mu if all of its elements are positive; otherwise, one or more elements will be zero (and the rest may not be same as the elements of mu).
-
Scalar
getUntruncatedFraction
() const¶ Return the fraction of the Gaussian integral that was truncated by the bounds.
In series form (see fromSeriesParameters), this is
\[ \frac{\int_0^{\infty} e^{-q(\alpha)} d\alpha}{\int_{-infty}^{\infty} e^{-q(\alpha)} d\alpha} \]while in standard parameter form it is simply the normalization \(k\) described in fromStandardParameters().
-
Scalar
getLogPeakAmplitude
() const¶ Return the -log of the peak amplitude of the untruncated function.
In series form, this is equal to \(q(\mu)\) where \(\mu=-H^{-1}g\). In standard parameter form, this is \(\frac{1}{2}\ln\left|2\pi\Sigma\right| - \ln k\).
-
Scalar
getLogIntegral
() const¶ Return the -log of the integral of the truncated function.
More precisely, this is simply
\[ -\ln\int_{-\infty}^{\infty} f(\alpha) d\alpha \]In series form, this is equivalent to\[ -\ln\int_0^{\infty} e^{-q(\alpha)} d\alpha \]In standard parameter form it is 0 by construction.
-
~TruncatedGaussian
()¶
Public Static Functions
-
static TruncatedGaussian
fromSeriesParameters
(Scalar q0, Vector const &gradient, Matrix const &hessian)¶ Create from the first and second logarithmic derivatives of the Gaussian.
This causes the TruncatedGaussian to model the function:
\[ f(\alpha) = 1_{\alpha \ge 0}(\alpha) \; e^{-q(0) -g^T \alpha -\frac{1}{2}\alpha^T H \alpha} = 1_{\alpha \ge 0}(\alpha) \; e^{-q(\alpha)} \]Where \(1_{\alpha \ge 0}(\alpha)\) is the indicator function\[\begin{split} 1_{\alpha \ge 0}(\alpha) \equiv \begin{cases} 1 & \text{if $\alpha \ge 0$}\\ 0 & \text{if $\alpha \lt 0$} \end{cases} \end{split}\]Note that this implies\[ \left.\frac{\partial q}{\partial \alpha} \right|_{\alpha=0} = g \]\[ \left.\frac{\partial^2 q}{\partial \alpha^2} \right|_{\alpha=0} = H \]with (for \(\alpha \ge 0\))\[ q(\alpha) \equiv -\ln f(\alpha) \]Note that unlike that constructed by fromStandardParameters(), in this case \(f(\alpha)\) is NOT normalized to integrate to one.
- Parameters
[in] q0
: Zeroth-order term in the expansion[in] gradient
: Vector of first derivatives \(g\)[in] hessian
: Matrix of second derivatives \(H\) (symmetric)
-
static TruncatedGaussian
fromStandardParameters
(Vector const &mean, Matrix const &covariance)¶ Create from the “standard” mean and covariance parameters of the normal distribution.
This causes the TruncatedGaussian to model the function:
\[ f(\alpha) = \frac{1_{\alpha \ge 0}(\alpha)}{k\left|2\pi\Sigma\right|^{1/2}} e^{-\frac{1}{2}(\alpha-\mu)^T \Sigma^{-1} (\alpha-\mu)} = \frac{1_{\alpha \ge 0}(\alpha)}{k}\;\Phi(\alpha-\mu,\Sigma) \]Where \(1_{\alpha \ge 0}(\alpha)\) is the indicator function\[\begin{split} 1_{\alpha \ge 0}(\alpha) \equiv \begin{cases} 1 & \text{if $\alpha \ge 0$}\\ 0 & \text{if $\alpha \lt 0$} \end{cases} \end{split}\]and \(k\) is the normalization constant that \(f(\alpha)\) integrates to unity:\[ k \equiv \int_0^{\infty}\!\!\Phi(\alpha-\mu,\Sigma) d\alpha \]Note that unlike that constructed by fromSeriesParameters(), in this case \(f(\alpha\) is normalized to integrate to one.
- Parameters
[in] mean
: Mean vector \(\mu\)[in] covariance
: Covariance matrix \(\Sigma\) (symmetric)
-
enum