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: SKNMSIMethodABC

Multidimensional 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