Source code for bayesflow.simulators.benchmark_simulators.gaussian_mixture

import numpy as np

from .benchmark_simulator import BenchmarkSimulator


[docs] class GaussianMixture(BenchmarkSimulator): def __init__( self, D: int = 2, lower_bound: float = -10.0, upper_bound: float = 10.0, prob: float = 0.5, scale_c1: float = 1.0, scale_c2: float = 0.1, rng: np.random.Generator = None, ): """Gaussian Mixture simulated benchmark See: https://arxiv.org/pdf/2101.04653.pdf, Task T.7 Important: The parameterization uses scales, so use sqrt(var), if you want to be working with variances instead of scales. Parameters ---------- D: int, optional, default: 2 The dimensionality of the mixture model. lower_bound: float, optional, default: -10.0 The lower bound of the uniform prior. upper_bound: float, optional, default: 10.0 The upper bound of the uniform prior. prob: float, optional, default: 0.5 The mixture probability (coefficient). scale_c1: float, optional, default: 1.0 The scale of the first component. scale_c2: float, optional, default: 0.1 The scale of the second component. rng: np.random.Generator or None, optional, default: None An optional random number generator to use. """ self.D = D self.lower_bound = lower_bound self.upper_bound = upper_bound self.prob = prob self.scale_c1 = scale_c1 self.scale_c2 = scale_c2 self.rng = rng if self.rng is None: self.rng = np.random.default_rng()
[docs] def prior(self): """Generates a random draw from a 2-dimensional uniform prior bounded between `lower_bound` and `upper_bound` representing the common mean of a 2D Gaussian mixture model (GMM). Returns ------- params : np.ndarray of shape (D, ) A single draw from the D-dimensional uniform prior """ return self.rng.uniform(low=self.lower_bound, high=self.upper_bound, size=self.D)
[docs] def observation_model(self, params: np.ndarray): """Simulates data from the Gaussian mixture model (GMM) with shared location vector. For more details, see Parameters ---------- params : np.ndarray of shape (D, ) The D-dimensional vector of parameter locations. Returns ------- x : np.ndarray of shape (2, ) The 2D vector generated from the GMM simulator. """ # Draw component index idx = self.rng.binomial(n=1, p=self.prob) # Draw 2D-Gaussian sample according to component index if idx == 0: return self.rng.normal(loc=params, scale=self.scale_c1) return self.rng.normal(loc=params, scale=self.scale_c2)