This example demonstrates how to run a MM solver using K different MCMC initilization. Plot then on a circular plot all the configurations of the source localization.
# Authors: Yousra Bekhti <yousra.bekhti@gmail.com>
# Alexandre Gramfort <alexandre.gramfort@inria.fr>
# License: BSD (3-clause)
from copy import deepcopy
import numpy as np
import mne
from mne.datasets import sample
from mne.inverse_sparse.mxne_inverse import \
(_prepare_gain, is_fixed_orient, _make_sparse_stc)
from mne.inverse_sparse.mxne_optim import norm_l2inf
from bayes_mxne import (mm_mixed_norm_bayes, compute_block_norms)
from bayes_mxne.config_plots import energy_l2half_reg, circular_brain_plot
print(__doc__)
Let us read in the fif file for MNE sample dataset corresponding to the forward, the evoked and the covariance matrix.
data_path = sample.data_path()
fwd_fname = data_path + '/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif'
ave_fname = data_path + '/MEG/sample/sample_audvis-ave.fif'
cov_fname = data_path + '/MEG/sample/sample_audvis-shrunk-cov.fif'
subjects_dir = data_path + '/subjects'
condition = 'Left Auditory'
# Read noise covariance matrix
noise_cov = mne.read_cov(cov_fname)
# Handling average file
evoked = mne.read_evokeds(ave_fname, condition=condition, baseline=(None, 0))
evoked.crop(tmin=0.04, tmax=0.18)
evoked = evoked.pick_types(eeg=False, meg=True)
# Handling forward solution
forward = mne.read_forward_solution(fwd_fname)
forward = mne.convert_forward_solution(forward, surf_ori=True)
Run solver method
def apply_solver(evoked, forward, noise_cov, loose=0.2, depth=0.8, K=2000):
all_ch_names = evoked.ch_names
# put the forward solution in fixed orientation if it's not already
if loose is None and not is_fixed_orient(forward):
forward = deepcopy(forward)
forward = mne.convert_forward_solution(forward, force_fixed=True)
gain, gain_info, whitener, source_weighting, mask = _prepare_gain(
forward, evoked.info, noise_cov, pca=False, depth=depth,
loose=loose, weights=None, weights_min=None)
n_locations = gain.shape[1]
sel = [all_ch_names.index(name) for name in gain_info['ch_names']]
M = evoked.data[sel]
# Whiten data
M = np.dot(whitener, M)
n_orient = 1 if is_fixed_orient(forward) else 3
# The value of lambda for which the solution will be all zero
lambda_max = norm_l2inf(np.dot(gain.T, M), n_orient)
lambda_ref = 0.1 * lambda_max
Xs, active_sets = mm_mixed_norm_bayes(
M, gain, lambda_ref, n_orient=n_orient, K=K,
verbose=True)[:2]
solution_support = np.zeros((K, n_locations))
stcs, obj_fun = [], []
for k in range(K):
X = np.zeros((n_locations, Xs[k].shape[1]))
X[active_sets[k]] = Xs[k]
block_norms_new = compute_block_norms(X, n_orient)
block_norms_new = (block_norms_new > 0.05 * block_norms_new.max())
solution_support[k, :] = block_norms_new
stc = _make_sparse_stc(Xs[k], active_sets[k], forward, tmin=0.,
tstep=1. / evoked.info['sfreq'])
stcs.append(stc)
obj_fun.append(energy_l2half_reg(M, gain, stc.data, active_sets[k],
lambda_ref, n_orient))
return solution_support, stcs, obj_fun
loose, depth, K = None, 0.8, 5
out = apply_solver(evoked, forward, noise_cov, loose=loose,
depth=depth, K=K)
solution_support, stcs, obj_fun = out
Out:
Running iter 0
Running iter 1
iter 0 - active set 7498
iter 1 - active set 91
iter 2 - active set 11
iter 3 - active set 8
iter 4 - active set 8
iter 5 - active set 7
iter 6 - active set 7
iter 7 - active set 7
iter 8 - active set 7
iter 9 - active set 7
sample 0 - lppSamp -398304.5439423364 - relResSamp 2.1801381642906867 - lppMAP -797.9488729955079 - relResSamp 0.6965741620194833
Running iter 0
Running iter 1
iter 0 - active set 7498
iter 1 - active set 120
iter 2 - active set 12
iter 3 - active set 8
iter 4 - active set 7
iter 5 - active set 6
iter 6 - active set 5
iter 7 - active set 5
iter 8 - active set 4
iter 9 - active set 3
sample 1 - lppSamp -482231.64120754995 - relResSamp 2.3314875497004612 - lppMAP -749.8656178875016 - relResSamp 0.7301319299084807
Running iter 0
Running iter 1
iter 0 - active set 7498
iter 1 - active set 117
iter 2 - active set 11
iter 3 - active set 8
iter 4 - active set 4
iter 5 - active set 4
iter 6 - active set 4
iter 7 - active set 4
iter 8 - active set 4
iter 9 - active set 3
sample 2 - lppSamp -536030.6259261724 - relResSamp 2.4131300090525265 - lppMAP -742.6744146823053 - relResSamp 0.724258794805546
Running iter 0
Running iter 1
iter 0 - active set 7498
iter 1 - active set 126
iter 2 - active set 9
iter 3 - active set 5
iter 4 - active set 5
iter 5 - active set 5
iter 6 - active set 5
iter 7 - active set 5
iter 8 - active set 5
iter 9 - active set 5
sample 3 - lppSamp -576014.055157692 - relResSamp 2.439309582541763 - lppMAP -765.936390416088 - relResSamp 0.7057898876406973
Running iter 0
Running iter 1
iter 0 - active set 7498
iter 1 - active set 130
iter 2 - active set 10
iter 3 - active set 8
iter 4 - active set 6
iter 5 - active set 6
iter 6 - active set 6
iter 7 - active set 5
iter 8 - active set 5
iter 9 - active set 5
sample 4 - lppSamp -607746.073836598 - relResSamp 2.4919080067238566 - lppMAP -765.2909101492836 - relResSamp 0.692353075307028
Plotting of all configurations intro a circular plot
circular_brain_plot(forward, solution_support, stcs, obj_fun)
Out:
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
setting roll
Total running time of the script: ( 34 minutes 24.499 seconds)