-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
mne.compute_covariance raises error with method="auto" #13782
Copy link
Copy link
Open
Labels
Description
Description of the problem
I am trying to follow the steps in this tutorial but the "compute_covariance" function results in an algorithmic convergence failure.
Steps to reproduce
I am running the Jupyter notebook "evoked_whitening.ipynb" downloadable at this link (https://mne.tools/stable/auto_examples/visualization/evoked_whitening.html) in a conda environment:
conda v26.1.1
jupyter v1.1.1
mne-base v1.11.0
python v3.13.9
The following lines raise an error:
method_params = dict(diagonal_fixed=dict(mag=0.01, grad=0.01, eeg=0.01))
noise_covs = compute_covariance(
epochs,
tmin=None,
tmax=0,
method="auto",
return_estimators=True,
n_jobs=None,
projs=None,
rank=None,
method_params=method_params,
verbose=True,
)
# With "return_estimator=True" all estimated covariances sorted
# by log-likelihood are returned.
print("Covariance estimates sorted from best to worst")
for c in noise_covs:
print(f"{c['method']} : {c['loglik']}")Link to data
No response
Expected results
As in this tutorial.
Actual results
Created an SSP operator (subspace dimension = 4)
Setting small MEG eigenvalues to zero (without PCA)
Setting small EEG eigenvalues to zero (without PCA)
Reducing data rank from 364 -> 360
Estimating covariance using SHRUNK
C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_validation.py:953: UserWarning: Scoring failed. The score on this train-test partition for these parameters will be set to nan. Details:
Traceback (most recent call last):
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_validation.py", line 940, in _score
scores = scorer(estimator, X_test, **score_params)
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\metrics\_scorer.py", line 492, in __call__
return estimator.score(*args, **kwargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\covariance\_empirical_covariance.py", line 288, in score
res = log_likelihood(test_cov, self.get_precision())
~~~~~~~~~~~~~~~~~~^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\covariance\_empirical_covariance.py", line 230, in get_precision
precision = linalg.pinvh(self.covariance_, check_finite=False)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_basic.py", line 1726, in pinvh
s, u = _decomp.eigh(a, lower=lower, check_finite=False, driver='ev')
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_decomp.py", line 620, in eigh
raise LinAlgError(msg)
numpy.linalg.LinAlgError: The algorithm failed to converge; 202 off-diagonal elements of an intermediate tridiagonal form did not converge to zero.
warnings.warn(
C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_validation.py:953: UserWarning: Scoring failed. The score on this train-test partition for these parameters will be set to nan. Details:
Traceback (most recent call last):
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_validation.py", line 940, in _score
scores = scorer(estimator, X_test, **score_params)
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\metrics\_scorer.py", line 492, in __call__
return estimator.score(*args, **kwargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\covariance\_empirical_covariance.py", line 288, in score
res = log_likelihood(test_cov, self.get_precision())
~~~~~~~~~~~~~~~~~~^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\covariance\_empirical_covariance.py", line 230, in get_precision
precision = linalg.pinvh(self.covariance_, check_finite=False)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_basic.py", line 1726, in pinvh
s, u = _decomp.eigh(a, lower=lower, check_finite=False, driver='ev')
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_decomp.py", line 620, in eigh
raise LinAlgError(msg)
numpy.linalg.LinAlgError: The algorithm failed to converge; 202 off-diagonal elements of an intermediate tridiagonal form did not converge to zero.
[...]
warnings.warn(
C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_search.py:1135: UserWarning: One or more of the test scores are non-finite: [ nan nan nan nan
nan nan nan nan
nan nan -inf nan
nan nan nan -inf
nan -inf nan nan
-1032.04034359 -1039.33041563 -1048.84139831 -1060.94429543
nan nan nan nan
-1158.92270153 -1246.99239465]
warnings.warn(
C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_search.py:1146: RuntimeWarning: invalid value encountered in subtract
(array - array_means[:, np.newaxis]) ** 2, axis=1, weights=weights
Done.
Estimating covariance using DIAGONAL_FIXED
MAG regularization : 0.01
GRAD regularization : 0.01
EEG regularization : 0.01
Done.
Estimating covariance using EMPIRICAL
Done.
Using cross-validation to select the best estimator.
MAG regularization : 0.01
GRAD regularization : 0.01
EEG regularization : 0.01
C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_validation.py:971: UserWarning: Scoring failed. The score on this train-test partition for these parameters will be set to nan. Details:
Traceback (most recent call last):
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\metrics\_scorer.py", line 156, in __call__
score = scorer(estimator, *args, **routed_params.get(name).score)
File "C:\Users\Utente\anaconda3\Lib\site-packages\mne\cov.py", line 1443, in _gaussian_loglik_scorer
precision = est.get_precision()
File "C:\Users\Utente\anaconda3\Lib\site-packages\mne\cov.py", line 1681, in get_precision
return self.estimator_.get_precision()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\mne\fixes.py", line 301, in get_precision
precision = linalg.pinvh(self.covariance_)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_basic.py", line 1726, in pinvh
s, u = _decomp.eigh(a, lower=lower, check_finite=False, driver='ev')
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_decomp.py", line 620, in eigh
raise LinAlgError(msg)
numpy.linalg.LinAlgError: The algorithm failed to converge; 359 off-diagonal elements of an intermediate tridiagonal form did not converge to zero.
warnings.warn(
MAG regularization : 0.01
GRAD regularization : 0.01
EEG regularization : 0.01
C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_validation.py:971: UserWarning: Scoring failed. The score on this train-test partition for these parameters will be set to nan. Details:
Traceback (most recent call last):
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\metrics\_scorer.py", line 156, in __call__
score = scorer(estimator, *args, **routed_params.get(name).score)
File "C:\Users\Utente\anaconda3\Lib\site-packages\mne\cov.py", line 1443, in _gaussian_loglik_scorer
precision = est.get_precision()
File "C:\Users\Utente\anaconda3\Lib\site-packages\mne\cov.py", line 1612, in get_precision
return self.estimator_.get_precision()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\mne\fixes.py", line 301, in get_precision
precision = linalg.pinvh(self.covariance_)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_basic.py", line 1726, in pinvh
s, u = _decomp.eigh(a, lower=lower, check_finite=False, driver='ev')
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_decomp.py", line 620, in eigh
raise LinAlgError(msg)
numpy.linalg.LinAlgError: The algorithm failed to converge; 358 off-diagonal elements of an intermediate tridiagonal form did not converge to zero.
[...]
warnings.warn(
Number of samples used : 1891
log-likelihood on unseen data (descending order):
shrunk: nan
diagonal_fixed: nan
empirical: nan
[done]
Covariance estimates sorted from best to worst
shrunk : nan
diagonal_fixed : nan
empirical : nan
C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\model_selection\_validation.py:971: UserWarning: Scoring failed. The score on this train-test partition for these parameters will be set to nan. Details:
Traceback (most recent call last):
File "C:\Users\Utente\anaconda3\Lib\site-packages\sklearn\metrics\_scorer.py", line 156, in __call__
score = scorer(estimator, *args, **routed_params.get(name).score)
File "C:\Users\Utente\anaconda3\Lib\site-packages\mne\cov.py", line 1443, in _gaussian_loglik_scorer
precision = est.get_precision()
File "C:\Users\Utente\anaconda3\Lib\site-packages\mne\fixes.py", line 301, in get_precision
precision = linalg.pinvh(self.covariance_)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_basic.py", line 1726, in pinvh
s, u = _decomp.eigh(a, lower=lower, check_finite=False, driver='ev')
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\_lib\_util.py", line 1233, in wrapper
return f(*arrays, *other_args, **kwargs)
File "C:\Users\Utente\anaconda3\Lib\site-packages\scipy\linalg\_decomp.py", line 620, in eigh
raise LinAlgError(msg)
numpy.linalg.LinAlgError: The algorithm failed to converge; 358 off-diagonal elements of an intermediate tridiagonal form did not converge to zero.
warnings.warn(
Additional information
Platform Windows-11-10.0.26200-SP0
Python 3.13.9 | packaged by Anaconda, Inc. | (main, Oct 21 2025, 19:09:58) [MSC v.1929 64 bit (AMD64)]
Executable C:\Users\Utente\anaconda3\python.exe
CPU AMD Ryzen 5 5600H with Radeon Graphics (12 cores)
Memory 15.3 GiB
Core
+ mne 1.11.0 (latest release)
+ numpy 2.3.5 (MKL 2025.0-Product with 6 threads)
+ scipy 1.16.3
+ matplotlib 3.10.6 (backend=module://matplotlib_inline.backend_inline)
Numerical (optional)
+ sklearn 1.7.2
+ numba 0.62.1
+ nibabel 5.4.0
+ pandas 2.3.3
+ h5io 0.2.5
+ h5py 3.15.1
- unavailable nilearn, dipy, openmeeg, cupy
Visualization (optional)
+ pyvista 0.47.1 (OpenGL 4.6.0 Compatibility Profile Context 22.20.44.221025 via AMD Radeon(TM) Graphics)
+ pyvistaqt 0.11.3
+ vtk 9.5.2
+ qtpy 2.4.3 (PyQt5=5.15.2)
+ ipympl 0.9.7
+ ipywidgets 8.1.7
- unavailable pyqtgraph, mne-qt-browser, trame_client, trame_server, trame_vtk, trame_vuetify
Ecosystem (optional)
+ defusedxml 0.7.1
- unavailable mne-bids, mne-nirs, mne-features, mne-connectivity, mne-icalabel, mne-bids-pipeline, neo, eeglabio, edfio, curryreader, mffpy, pybv, antio
Reactions are currently unavailable