Skip to content

mne.compute_covariance raises error with method="auto" #13782

@barbaracassone

Description

@barbaracassone

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions