skneuromsi.bayesian._zhu2024 module
Implementation of multisensory integration models in Python.
- class skneuromsi.bayesian._zhu2024.Zhu2024(*, n=1, mode0='auditory', mode1='visual', numerosity_range=(0, 4), numerosity_res=0.1, time_range=(0, 1000), time_res=10, position_range=(0, 1), position_res=1, seed=None)[source]
Bases:
SKNMSIMethodABCMultidimensional Bayesian Causal Inference (BCI) model.
This model based on Zhu et al. (2024) uses Bayesian principles to infer whether different sensory inputs (auditory and visual) share a common cause or arise from independent sources. It extends traditional BCI approaches by simultaneously processing multiple dimensions (numerosity and timing).
This model is specifically designed to explain the Sound-Induced Flash Illusion, where a single visual flash accompanied by multiple auditory beeps is often perceived as more than one flash due to cross-modal integration.
The implementation follows the mathematical formulation described in Zhu et al. (2024, 2025), and is tested to reproduce the modelling results described in Zhu et al. (2024).
References
[Zhu et al., 2024b] [Zhu et al., 2025]
- property mode0
First sensory modality (typically auditory).
- property mode1
Second sensory modality (typically visual).
- property n
Number of simulations to run.
- property numerosity_range
Range of possible numerosity values (min, max).
- property numerosity_res
Resolution (step size) for numerosity discretization.
- property time_range
Range of possible time values in milliseconds (min, max).
- property time_res
Resolution (step size) for time discretization in milliseconds.
- property position_range
Returns the range of positions considered for estimation.
- Returns:
The range of positions. E.g., (0, 1).
- Return type:
tuple of float
- property position_res
Returns the resolution of positions considered for estimation.
- Returns:
The resolution of positions. E.g., 1.0.
- Return type:
float
- property random
Random number generator instance.
- set_random(rng)[source]
Set the random number generator for stochastic simulations.
- Parameters:
rng (numpy.random.Generator) – Random number generator instance.
- input_computation(value, variance, noise)[source]
Generate noisy sensory measurements by adding Gaussian noise.
This simulates how sensory inputs are corrupted by independent Gaussian noise during neural processing.
- Parameters:
value (float) – True stimulus value (e.g., actual number of flashes or beeps).
variance (float) – Variance of the sensory noise.
noise (bool) – If True, adds random noise; if False, adds deterministic noise.
- Returns:
Noisy sensory measurement(s).
- Return type:
float or ndarray
- unisensory_estimator(value, sigma, prior_mu, prior_sigma)[source]
Compute optimal Bayesian estimate for a single sensory modality.
This implements the reliability-weighted combination of sensory evidence and prior expectations, following the Bayes optimal observer model.
- Parameters:
value (float or ndarray) – Noisy sensory measurement(s).
sigma (float) – Standard deviation of the sensory noise.
prior_mu (float) – Mean of the prior distribution.
prior_sigma (float) – Standard deviation of the prior distribution.
- Returns:
Optimal unisensory estimate(s).
- Return type:
float or ndarray
- multisensory_estimator(aud_num, vis_num, aud_time, vis_time, aud_num_sigma, vis_num_sigma, aud_time_sigma, vis_time_sigma, prior_num_mu, prior_num_sigma, prior_time_mu, prior_time_sigma, p_common, strategy, numerosity_possible, time_possible, est_aud_num_ind, est_vis_num_ind, est_aud_time_ind, est_vis_time_ind)[source]
Computes the multisensory estimates for both numerosity and time.
This method first computes the common and independent likelihoods for each dimension, combines them to compute the posterior probability of a common cause (pc), and then uses a decision strategy (selection, averaging, or matching) to combine the estimates.
- Parameters:
aud_num (float or ndarray) – Auditory and visual numerosity inputs.
vis_num (float or ndarray) – Auditory and visual numerosity inputs.
aud_time (float or ndarray) – Auditory and visual time inputs.
vis_time (float or ndarray) – Auditory and visual time inputs.
aud_num_sigma (float) – Standard deviations for auditory and visual numerosity.
vis_num_sigma (float) – Standard deviations for auditory and visual numerosity.
aud_time_sigma (float) – Standard deviations for auditory and visual time.
vis_time_sigma (float) – Standard deviations for auditory and visual time.
prior_num_mu (float) – Prior means for numerosity and time.
prior_time_mu (float) – Prior means for numerosity and time.
prior_num_sigma (float) – Prior standard deviations for numerosity and time.
prior_time_sigma (float) – Prior standard deviations for numerosity and time.
p_common (float) – Prior probability of a common cause.
strategy (str) – Decision strategy (“selection”, “averaging”, or “matching”).
numerosity_possible (ndarray) – Possible numerosity values (bins) for estimation.
time_possible (ndarray) – Possible time values (bins) for estimation.
est_aud_num_ind (ndarray) – Independent estimates for auditory and visual numerosity.
est_vis_num_ind (ndarray) – Independent estimates for auditory and visual numerosity.
est_aud_time_ind (ndarray) – Independent estimates for auditory and visual time.
est_vis_time_ind (ndarray) – Independent estimates for auditory and visual time.
- Returns:
- Dictionary with keys:
”auditory_numerosity”: Distribution for auditory numerosity.
”visual_numerosity”: Distribution for visual numerosity.
”auditory_time”: Distribution for auditory time.
”visual_time”: Distribution for visual time.
”pc”: Posterior probability of a common cause.
- Return type:
dict
- run(*, auditory_numerosity=2, visual_numerosity=1, auditory_numerosity_sigma=0.12, visual_numerosity_sigma=0.48, auditory_time=558.5, visual_time=500.0, auditory_time_sigma=40.0, visual_time_sigma=60.0, p_common=0.6, prior_numerosity_sigma=1.0, prior_numerosity_mu=1.0, prior_time_sigma=100.0, prior_time_mu=500.0, strategy='averaging', noise=True, causes_kind='count')[source]
Runs the Multidimensional BCI model simulation.
This is the main entry point for running a complete simulation. It orchestrates the entire process from generating noisy sensory measurements to computing final perceptual estimates across both dimensions.
- Parameters:
auditory_numerosity (float) – Observed numerosity for the auditory modality (i.e., beeps).
visual_numerosity (float) – Observed numerosity for the visual modality (i.e., flashes).
auditory_numerosity_sigma (float) – Sensory noise (SD) for auditory numerosity.
visual_numerosity_sigma (float) – Sensory noise (SD) for visual numerosity.
auditory_time (float) – Observed onset time for the auditory stimulus (in ms).
visual_time (float) – Observed onset time for the visual stimulus (in ms).
auditory_time_sigma (float) – Sensory noise (SD) for auditory time (in ms).
visual_time_sigma (float) – Sensory noise (SD) for visual time (in ms).
p_common (float, default=0.5) – Prior probability of a common cause.
prior_numerosity_sigma (float, default=5.0) – Prior standard deviation for numerosity.
prior_numerosity_mu (float, default=5.0) – Prior mean for numerosity.
prior_time_sigma (float, default=100.0) – Prior standard deviation for time (in ms).
prior_time_mu (float, default=500.0) – Prior mean for time (in ms).
strategy (str, default="averaging") – Decision strategy: “selection”, “averaging”, or “matching”.
noise (bool, default=True) – Whether to include stochastic noise in sensory measurements.
causes_kind (str, default="count") – Type of cause calculation (“count” or “prob”).
- Returns:
- A tuple containing:
dict: Response with perceptual distributions for each modality.
dict: Extra information including
mean probability of common cause and numerosity estimates.
- Return type:
tuple
- calculate_causes(mean_p_common_cause, causes_kind, **kwargs)[source]
Calculates the causes of the stimuli.
- Parameters:
mean_p_common_cause (float or np.ndarray) – The average probability of a common cause across simulations.
causes_kind (str) – The type of cause to calculate (“count” or “prob”).
- Returns:
The number of causes if causes_kind is “count”, the probability of a unique cause if causes_kind is “prob”, or None if no valid cause type is specified.
- Return type:
int or float or None