This is an automated email from the git hooks/post-receive script. yoh pushed a commit to tag 0.4 in repository python-mne.
commit 822a8ebcd55ffe26e87e8e209032d2bee9275270 Author: Alexandre Gramfort <[email protected]> Date: Thu Jul 19 09:21:38 2012 +0200 ENH : add refs + cleanup in MxNE --- examples/inverse/plot_mixed_norm_L21_inverse.py | 10 ++++++---- mne/forward.py | 10 +++------- mne/minimum_norm/inverse.py | 6 +++--- mne/mixed_norm/debiasing.py | 10 ++++++++++ mne/mixed_norm/inverse.py | 25 ++++++++++++++----------- mne/mixed_norm/optim.py | 12 ++++++++++++ 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/examples/inverse/plot_mixed_norm_L21_inverse.py b/examples/inverse/plot_mixed_norm_L21_inverse.py index c60668d..b2b2458 100644 --- a/examples/inverse/plot_mixed_norm_L21_inverse.py +++ b/examples/inverse/plot_mixed_norm_L21_inverse.py @@ -1,12 +1,13 @@ """ -=============================================== -Compute sparse solver based on L1/L2 mixed norm -=============================================== +================================================================ +Compute sparse inverse solution based on L1/L2 mixed norm (MxNE) +================================================================ See Gramfort A., Kowalski M. and Hamalainen, M, Mixed-norm estimates for the M/EEG inverse problem using accelerated gradient methods, Physics in Medicine and Biology, 2012 +http://dx.doi.org/10.1088/0031-9155/57/7/1937 """ # Author: Alexandre Gramfort <[email protected]> # @@ -51,7 +52,8 @@ loose, depth = 0.2, 0.9 # loose orientation & depth weighting # Compute dSPM solution to be used as weights in MxNE inverse_operator = make_inverse_operator(evoked.info, forward, cov, loose=loose, depth=depth) -stc_dspm = apply_inverse(evoked, inverse_operator, lambda2=1. / 9., dSPM=True) +stc_dspm = apply_inverse(evoked, inverse_operator, lambda2=1. / 9., + method='dSPM') # Compute MxNE inverse solution stc, residual = mixed_norm(evoked, forward, cov, alpha, loose=loose, diff --git a/mne/forward.py b/mne/forward.py index b66686c..ba562b1 100644 --- a/mne/forward.py +++ b/mne/forward.py @@ -544,15 +544,11 @@ def compute_orient_prior(forward, loose=0.2): if is_fixed_ori: orient_prior = np.ones(n_sources, dtype=np.float) else: - n_dip_per_pos = 1 if is_fixed_ori else 3 - n_positions = n_sources / 3 - n_dipoles = n_positions * n_dip_per_pos - orient_prior = np.ones(n_dipoles, dtype=np.float) - + orient_prior = np.ones(n_sources, dtype=np.float) if loose is not None: print ('Applying loose dipole orientations. Loose value of %s.' % loose) - orient_prior[np.mod(np.arange(n_dipoles), 3) != 2] *= loose + orient_prior[np.mod(np.arange(n_sources), 3) != 2] *= loose return orient_prior @@ -625,7 +621,7 @@ def _fill_measurement_info(info, fwd, sfreq): def _apply_forward(fwd, stc, start=None, stop=None): """ Apply forward model and return data, times, ch_names """ - if not is_fixed_orient(fwd['source_ori']): + if not is_fixed_orient(fwd): raise ValueError('Only fixed-orientation forward operators are ' 'supported.') diff --git a/mne/minimum_norm/inverse.py b/mne/minimum_norm/inverse.py index 88d5bf0..c810a5c 100644 --- a/mne/minimum_norm/inverse.py +++ b/mne/minimum_norm/inverse.py @@ -961,8 +961,8 @@ def _xyz2lf(Lf_xyz, normals): ############################################################################### # Assemble the inverse operator -def _prepare_inverse(forward, info, noise_cov, pca=False): - """Util function for inverse solvers +def _prepare_forward(forward, info, noise_cov, pca=False): + """Util function to prepare forward solution for inverse solvers """ fwd_ch_names = [c['ch_name'] for c in forward['info']['chs']] ch_names = [c['ch_name'] for c in info['chs'] @@ -1044,7 +1044,7 @@ def make_inverse_operator(info, forward, noise_cov, loose=0.2, depth=0.8): raise ValueError('depth should be a scalar between 0 and 1') ch_names, gain, noise_cov, whitener, n_nzero = \ - _prepare_inverse(forward, info, noise_cov) + _prepare_forward(forward, info, noise_cov) n_dipoles = gain.shape[1] diff --git a/mne/mixed_norm/debiasing.py b/mne/mixed_norm/debiasing.py index e962a4e..95d7f47 100755 --- a/mne/mixed_norm/debiasing.py +++ b/mne/mixed_norm/debiasing.py @@ -30,6 +30,10 @@ def power_iteration_kron(A, C, max_iter=1000, tol=1e-3, random_state=0): ------- L : float largest singular value + + Notes + ----- + http://en.wikipedia.org/wiki/Power_iteration """ AS_size = C.shape[0] rng = check_random_state(random_state) @@ -58,6 +62,12 @@ def compute_bias(M, G, X, max_iter=1000, tol=1e-4, n_orient=1): min 1/2 * (|| M - GDX ||fro)^2 s.t. D >= 0 and D is a diagonal matrix + Reference for the FISTA algorithm: + Amir Beck and Marc Teboulle + A Fast Iterative Shrinkage-Thresholding Algorithm for Linear Inverse + Problems, SIAM J. Imaging Sci., 2(1), 183-202. (20 pages) + http://epubs.siam.org/doi/abs/10.1137/080716542 + Parameters ---------- M : array diff --git a/mne/mixed_norm/inverse.py b/mne/mixed_norm/inverse.py index 19c49a5..ba15138 100644 --- a/mne/mixed_norm/inverse.py +++ b/mne/mixed_norm/inverse.py @@ -7,7 +7,7 @@ import numpy as np from scipy import linalg from ..source_estimate import SourceEstimate -from ..minimum_norm.inverse import combine_xyz, _make_stc, _prepare_inverse +from ..minimum_norm.inverse import combine_xyz, _make_stc, _prepare_forward from ..forward import compute_orient_prior, is_fixed_orient from ..fiff.pick import pick_channels_evoked from .optim import mixed_norm_solver, norm_l2inf @@ -84,9 +84,15 @@ def mixed_norm(evoked, forward, noise_cov, alpha, loose=0.2, depth=0.8, Compute L1/L2 mixed-norm solution on evoked data. + Reference: + Gramfort A., Kowalski M. and Hamalainen, M, + Mixed-norm estimates for the M/EEG inverse problem using accelerated + gradient methods, Physics in Medicine and Biology, 2012 + http://dx.doi.org/10.1088/0031-9155/57/7/1937 + Parameters ---------- - evoked : instance of Evoked or list of instance of Evoked + evoked : instance of Evoked or list of instances of Evoked Evoked data to invert forward : dict Forward operator @@ -123,14 +129,11 @@ def mixed_norm(evoked, forward, noise_cov, alpha, loose=0.2, depth=0.8, Returns ------- - stc : dict - Source time courses - - References - ---------- - Gramfort A., Kowalski M. and Hamalainen, M, - Mixed-norm estimates for the M/EEG inverse problem using accelerated - gradient methods, Physics in Medicine and Biology, 2012 + stc : SourceEstimate | list of SourceEstimate + Source time courses for each evoked data passed as input. + residual : instance of Evoked + The residual a.k.a. data not explained by the sources. + Only returned if return_residual is True. """ if not isinstance(evoked, list): evoked = [evoked] @@ -141,7 +144,7 @@ def mixed_norm(evoked, forward, noise_cov, alpha, loose=0.2, depth=0.8, raise Exception('All the datasets must have the same good channels.') info = evoked[0].info - ch_names, gain, _, whitener, _ = _prepare_inverse(forward, + ch_names, gain, _, whitener, _ = _prepare_forward(forward, info, noise_cov, pca) # Whiten lead field. diff --git a/mne/mixed_norm/optim.py b/mne/mixed_norm/optim.py index 147c114..44942d8 100644 --- a/mne/mixed_norm/optim.py +++ b/mne/mixed_norm/optim.py @@ -108,6 +108,12 @@ def prox_l1(Y, alpha, n_orient): def dgap_l21(M, G, X, active_set, alpha, n_orient): """Duality gaps for the mixed norm inverse problem + For details see: + Gramfort A., Kowalski M. and Hamalainen, M, + Mixed-norm estimates for the M/EEG inverse problem using accelerated + gradient methods, Physics in Medicine and Biology, 2012 + http://dx.doi.org/10.1088/0031-9155/57/7/1937 + Parameters ---------- M : array of shape [n_sensors, n_times] @@ -215,6 +221,12 @@ def mixed_norm_solver(M, G, alpha, maxit=200, tol=1e-8, verbose=True, active_set_size=50, debias=True, n_orient=1): """Solves L21 inverse solver with active set strategy + Algorithm is detailed in: + Gramfort A., Kowalski M. and Hamalainen, M, + Mixed-norm estimates for the M/EEG inverse problem using accelerated + gradient methods, Physics in Medicine and Biology, 2012 + http://dx.doi.org/10.1088/0031-9155/57/7/1937 + Parameters ---------- M : array -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-mne.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
