Implementation of FastSRM algorithms.
The model of probabilistic SRM is given by:
where
is the data of subject
is the basis of subject
is the shared response (or sources) assumed to be sampled from a centered Gaussian with covariance
is the noise in subject
assumed to be sampled from a centered Gaussian with covariance
where
is the identity matrix. We call
the noise variance of subject
.
In practice we observe n samples of . When the number of samples is much lower than the number of features v, the SRM model can be fitted efficiently. This is what this repository provides. We also assume that the covariance of the shared response is diagonal to obtain identifiability.
Clone the repository
git clone https://github.com/hugorichard/FastSRM
In the cloned directory execute
pip install -e .
Requirements:
scipy>=0.18.0
numpy>=1.12
scikit-learn>=0.23
joblib>=1.1.0
matplotlib>=2.0.0
pytest>=6.2.5
To run the experiments on identifiability, brainiak (https://github.com/brainiak/brainiak) and nilearn (https://nilearn.github.io/stable/index.html) are necessary.
In many neuroscience datasets, the samples are split into sessions. Therefore, for each subject we will have several sessions that can be time-wise concatenated to obtain all samples.
In IdentifiableFastSRM
# Input data X: neuroimaging data
# X is a np array of shape (n_subjects, n_sessions)
# X[i, j] is a path to a np array of shape (n_voxels, n_timeframes)
from fastsrm.identifiable_srm import IdentifiableFastSRM
srm = IdentifiableFastSRM(n_components=5, temp_dir="./", n_jobs=5)
S = srm.fit_transform(X) # Shared response: np array of shape (n_components, n_timeframes)
W = srm.basis_list # Shared response: np array of shape (n_components, n_timeframes)
Sigma = srm.source_covariance # (Diagonal) Covariance of the shared response: np array of shape (n_components,)
sigmas = srm.noise_variance # Variance of the noise: np array of shape (n_subjects)
-
In the
experiments
folder runipython synthetic.py
-
Go in the
plotting
folder and runipython plot_synthetic_gradients.py
The figure is now available in the figures
folder under the name
synthetic_gradient.pdf
-
Go in the experiments folder and download the sherlock dataset by running:
ipython get_sherlock.py
-
Go in the
experiments
folder and runbash timesegment.bash
if you have access to a cluster with slurm otherwise runbash timesegment_local.bash
-
Go in the
plotting
folder and runipython plot_timesegment.py
The figure is now available in the figures
folder under the name
timesegment_matching_sherlock.pdf
-
Go in the experiments folder and download the sherlock dataset by running:
ipython get_sherlock.py
-
Download and install Brainiak (see https://github.com/brainiak/brainiak)
-
Go in the
experiments
folder and runbash identifiability.bash
if you have access to a cluster with slurm otherwise runbash identifiability_local.bash
-
Go in the
plotting
folder and runipython plot_identifiability.py
The figure is now available in the figures
folder under the name
identifiability.pdf