.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/02_decoding/plot_haxby_searchlight.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_02_decoding_plot_haxby_searchlight.py: Searchlight analysis of face vs house recognition ================================================= Searchlight analysis requires fitting a classifier a large amount of times. As a result, it is an intrinsically slow method. In order to speed up computing, in this example, Searchlight is run only on one slice on the :term:`fMRI` (see the generated figures). .. include:: ../../../examples/masker_note.rst .. GENERATED FROM PYTHON SOURCE LINES 15-17 Load Haxby dataset ------------------ .. GENERATED FROM PYTHON SOURCE LINES 17-34 .. code-block:: Python import pandas as pd from nilearn import datasets from nilearn.image import get_data, load_img, new_img_like # We fetch 2nd subject from haxby datasets (which is default) haxby_dataset = datasets.fetch_haxby() # print basic information on the dataset print(f"Anatomical nifti image (3D) is located at: {haxby_dataset.mask}") print(f"Functional nifti image (4D) is located at: {haxby_dataset.func[0]}") fmri_filename = haxby_dataset.func[0] labels = pd.read_csv(haxby_dataset.session_target[0], sep=" ") y = labels["labels"] run = labels["chunks"] .. rst-class:: sphx-glr-script-out .. code-block:: none Anatomical nifti image (3D) is located at: /home/himanshu/nilearn_data/haxby2001/mask.nii.gz Functional nifti image (4D) is located at: /home/himanshu/nilearn_data/haxby2001/subj2/bold.nii.gz .. GENERATED FROM PYTHON SOURCE LINES 35-37 Restrict to faces and houses ---------------------------- .. GENERATED FROM PYTHON SOURCE LINES 37-44 .. code-block:: Python from nilearn.image import index_img condition_mask = y.isin(["face", "house"]) fmri_img = index_img(fmri_filename, condition_mask) y, run = y[condition_mask], run[condition_mask] .. GENERATED FROM PYTHON SOURCE LINES 45-51 Prepare masks ------------- - mask_img is the original mask - process_mask_img is a subset of mask_img, it contains the voxels that should be processed (we only keep the slice z = 29 and the back of the brain to speed up computation) .. GENERATED FROM PYTHON SOURCE LINES 51-63 .. code-block:: Python import numpy as np mask_img = load_img(haxby_dataset.mask) # .astype() makes a copy. process_mask = get_data(mask_img).astype(int) picked_slice = 29 process_mask[..., (picked_slice + 1) :] = 0 process_mask[..., :picked_slice] = 0 process_mask[:, 30:] = 0 process_mask_img = new_img_like(mask_img, process_mask) .. rst-class:: sphx-glr-script-out .. code-block:: none /home/himanshu/Desktop/nilearn_work/nilearn/examples/02_decoding/plot_haxby_searchlight.py:61: UserWarning: Data array used to create a new image contains 64-bit ints. This is likely due to creating the array with numpy and passing `int` as the `dtype`. Many tools such as FSL and SPM cannot deal with int64 in Nifti images, so for compatibility the data has been converted to int32. .. GENERATED FROM PYTHON SOURCE LINES 64-66 Searchlight computation ----------------------- .. GENERATED FROM PYTHON SOURCE LINES 66-93 .. code-block:: Python # Make processing parallel # /!\ As each thread will print its progress, n_jobs > 1 could mess up the # information output. n_jobs = 2 # Define the cross-validation scheme used for validation. # Here we use a KFold cross-validation on the run, which corresponds to # splitting the samples in 4 folds and make 4 runs using each fold as a test # set once and the others as learning sets from sklearn.model_selection import KFold cv = KFold(n_splits=4) import nilearn.decoding # The radius is the one of the Searchlight sphere that will scan the volume searchlight = nilearn.decoding.SearchLight( mask_img, process_mask_img=process_mask_img, radius=5.6, n_jobs=n_jobs, verbose=1, cv=cv, ) searchlight.fit(fmri_img, y) .. rst-class:: sphx-glr-script-out .. code-block:: none /home/himanshu/.local/miniconda3/envs/nilearnpy/lib/python3.12/site-packages/nilearn/image/resampling.py:492: UserWarning: The provided image has no sform in its header. Please check the provided file. Results may not be as expected. [Parallel(n_jobs=2)]: Using backend LokyBackend with 2 concurrent workers. [Parallel(n_jobs=2)]: Done 2 out of 2 | elapsed: 25.5s finished .. raw:: html
SearchLight(cv=KFold(n_splits=4, random_state=None, shuffle=False),
                mask_img=<nibabel.nifti1.Nifti1Image object at 0x733231f66a50>,
                n_jobs=2,
                process_mask_img=<nibabel.nifti1.Nifti1Image object at 0x733231f66570>,
                radius=5.6, verbose=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 94-96 F-scores computation -------------------- .. GENERATED FROM PYTHON SOURCE LINES 96-115 .. code-block:: Python from nilearn.maskers import NiftiMasker # For decoding, standardizing is often very important nifti_masker = NiftiMasker( mask_img=mask_img, runs=run, standardize="zscore_sample", memory="nilearn_cache", memory_level=1, ) fmri_masked = nifti_masker.fit_transform(fmri_img) from sklearn.feature_selection import f_classif _, p_values = f_classif(fmri_masked, y) p_values = -np.log10(p_values) p_values[p_values > 10] = 10 p_unmasked = get_data(nifti_masker.inverse_transform(p_values)) .. GENERATED FROM PYTHON SOURCE LINES 116-119 Visualization ------------- Use the :term:`fMRI` mean image as a surrogate of anatomical data .. GENERATED FROM PYTHON SOURCE LINES 119-155 .. code-block:: Python from nilearn import image mean_fmri = image.mean_img(fmri_img) from nilearn.plotting import plot_img, plot_stat_map, show searchlight_img = new_img_like(mean_fmri, searchlight.scores_) # Because scores are not a zero-center test statistics, we cannot use # plot_stat_map plot_img( searchlight_img, bg_img=mean_fmri, title="Searchlight", display_mode="z", cut_coords=[-9], vmin=0.42, cmap="hot", threshold=0.2, black_bg=True, ) # F_score results p_ma = np.ma.array(p_unmasked, mask=np.logical_not(process_mask)) f_score_img = new_img_like(mean_fmri, p_ma) plot_stat_map( f_score_img, mean_fmri, title="F-scores", display_mode="z", cut_coords=[-9], colorbar=False, ) show() .. rst-class:: sphx-glr-horizontal * .. image-sg:: /auto_examples/02_decoding/images/sphx_glr_plot_haxby_searchlight_001.png :alt: plot haxby searchlight :srcset: /auto_examples/02_decoding/images/sphx_glr_plot_haxby_searchlight_001.png :class: sphx-glr-multi-img * .. image-sg:: /auto_examples/02_decoding/images/sphx_glr_plot_haxby_searchlight_002.png :alt: plot haxby searchlight :srcset: /auto_examples/02_decoding/images/sphx_glr_plot_haxby_searchlight_002.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 35.690 seconds) **Estimated memory usage:** 916 MB .. _sphx_glr_download_auto_examples_02_decoding_plot_haxby_searchlight.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: binder-badge .. image:: images/binder_badge_logo.svg :target: https://mybinder.org/v2/gh/nilearn/nilearn/main?urlpath=lab/tree/notebooks/auto_examples/02_decoding/plot_haxby_searchlight.ipynb :alt: Launch binder :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_haxby_searchlight.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_haxby_searchlight.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_