[med-svn] [python-mne] 227/376: ENH : speeding up source_induced_power using true data dimension
Yaroslav Halchenko
debian at onerussian.com
Fri Nov 27 17:22:51 UTC 2015
This is an automated email from the git hooks/post-receive script.
yoh pushed a commit to annotated tag v0.1
in repository python-mne.
commit a63f8b10811d6068f658f45c2ee77384824a4b45
Author: Alexandre Gramfort <alexandre.gramfort at inria.fr>
Date: Thu Apr 28 11:57:14 2011 -0400
ENH : speeding up source_induced_power using true data dimension
---
.../plot_source_space_time_frequency.py | 12 +++++++++--
mne/minimum_norm/time_frequency.py | 23 +++++++++++++++++++---
2 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/examples/time_frequency/plot_source_space_time_frequency.py b/examples/time_frequency/plot_source_space_time_frequency.py
index f26f9aa..b7412d8 100644
--- a/examples/time_frequency/plot_source_space_time_frequency.py
+++ b/examples/time_frequency/plot_source_space_time_frequency.py
@@ -55,5 +55,13 @@ stcs = source_induced_power(epochs, inverse_operator, bands, n_cycles=2,
for b, stc in stcs.iteritems():
stc.save('induced_power_%s' % b)
-# View sources
-plot_source_estimate(inverse_operator['src'], stcs['alpha'])
+###############################################################################
+# plot mean power
+import pylab as pl
+pl.plot(stcs['alpha'].times, stcs['alpha'].data.mean(axis=0), label='Alpha')
+pl.plot(stcs['beta'].times, stcs['beta'].data.mean(axis=0), label='Beta')
+pl.xlabel('Time (ms)')
+pl.ylabel('Power')
+pl.legend()
+pl.title('Mean source induced power')
+pl.show()
diff --git a/mne/minimum_norm/time_frequency.py b/mne/minimum_norm/time_frequency.py
index d70c7b3..6c015da 100644
--- a/mne/minimum_norm/time_frequency.py
+++ b/mne/minimum_norm/time_frequency.py
@@ -3,6 +3,7 @@
# License: BSD (3-clause)
import numpy as np
+from scipy import linalg
from ..fiff.constants import FIFF
from ..stc import SourceEstimate
@@ -10,13 +11,16 @@ from ..time_frequency.tfr import cwt, morlet
from .inverse import combine_xyz, prepare_inverse_operator
-def _compute_power(data, K, sel, Ws, source_ori, use_fft):
+def _compute_power(data, K, sel, Ws, source_ori, use_fft, Vh):
"""Aux function for source_induced_power"""
power = 0
for e in data:
e = e[sel] # keep only selected channels
+ if Vh is not None:
+ e = np.dot(Vh, e) # reducing data rank
+
for w in Ws:
tfr = cwt(e, [w], use_fft=use_fft)
tfr = np.asfortranarray(tfr.reshape(len(e), -1))
@@ -38,7 +42,7 @@ def _compute_power(data, K, sel, Ws, source_ori, use_fft):
def source_induced_power(epochs, inverse_operator, bands, lambda2=1.0 / 9.0,
dSPM=True, n_cycles=5, df=1, use_fft=False,
- baseline=None, baseline_mode='logratio',
+ baseline=None, baseline_mode='logratio', pca=True,
subtract_evoked=False, n_jobs=1):
"""Compute source space induced power
@@ -73,6 +77,10 @@ def source_induced_power(epochs, inverse_operator, bands, lambda2=1.0 / 9.0,
power during baseline) or zscore (power is divided by standard
deviatio of power during baseline after substracting the mean,
power = [power - mean(power_baseline)] / std(power_baseline))
+ pca: bool
+ If True, the true dimension of data is estimated before running
+ the time frequency transforms. It reduces the computation times
+ e.g. with a dataset that was maxfiltered (true dim is 64)
subtract_evoked: bool
If True, the evoked component (average of all epochs) if subtracted
from each epochs.
@@ -127,6 +135,15 @@ def source_induced_power(epochs, inverse_operator, bands, lambda2=1.0 / 9.0,
inv['whitener'],
inv['proj']])
+ if pca:
+ U, s, Vh = linalg.svd(K)
+ rank = np.sum(s > 1e-8*s[0])
+ K = np.dot(K, s[:rank] * U[:, :rank])
+ Vh = Vh[:rank]
+ print 'Reducing data rank to %d' % rank
+ else:
+ Vh = None
+
#
# Transformation into current distributions by weighting the
# eigenleads with the weights computed above
@@ -158,7 +175,7 @@ def source_induced_power(epochs, inverse_operator, bands, lambda2=1.0 / 9.0,
Ws = morlet(Fs, freqs, n_cycles=n_cycles)
power = sum(parallel(my_compute_power(data, K, sel, Ws,
- inv['source_ori'], use_fft)
+ inv['source_ori'], use_fft, Vh)
for data in np.array_split(epochs_data, n_jobs)))
if dSPM:
--
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