[med-svn] [python-mne] 306/353: ENH : add refs + cleanup in MxNE

Yaroslav Halchenko debian at onerussian.com
Fri Nov 27 17:25:21 UTC 2015


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 <alexandre.gramfort at inria.fr>
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 <gramfort at nmr.mgh.harvard.edu>
 #
@@ -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



More information about the debian-med-commit mailing list