Source code for neurokit2.complexity.entropy_svd

import numpy as np
import pandas as pd

from .utils_complexity_embedding import complexity_embedding

[docs] def entropy_svd(signal, delay=1, dimension=2, show=False): """**Singular Value Decomposition (SVD) Entropy** SVD entropy (SVDEn) can be intuitively seen as an indicator of how many eigenvectors are needed for an adequate explanation of the dataset. In other words, it measures feature-richness: the higher the SVD entropy, the more orthogonal vectors are required to adequately explain the space-state. Similarly to :func:`Fisher Information (FI) <information_fisher>`, it is based on the Singular Value Decomposition of the :func:`time-delay embedded <complexity_embedding>` signal. See Also -------- information_fisher, complexity_embedding, complexity_delay, complexity_dimension Parameters ---------- signal : Union[list, np.array, pd.Series] The signal (i.e., a time series) in the form of a vector of values. delay : int Time delay (often denoted *Tau* :math:`\\tau`, sometimes referred to as *lag*) in samples. See :func:`complexity_delay` to estimate the optimal value for this parameter. dimension : int Embedding Dimension (*m*, sometimes referred to as *d* or *order*). See :func:`complexity_dimension` to estimate the optimal value for this parameter. show : bool If True, will plot the attractor. Returns ---------- svd : float The singular value decomposition (SVD). info : dict A dictionary containing additional information regarding the parameters used to compute SVDEn. Examples ---------- .. ipython:: python import neurokit2 as nk signal = nk.signal_simulate(duration=1, frequency=5) @savefig p_entropy_svd1.png scale=100% svden, info = nk.entropy_svd(signal, delay=5, dimension=3, show=True) @suppress plt.close() svden References ---------- * Roberts, S. J., Penny, W., & Rezek, I. (1999). Temporal and spatial complexity measures for electroencephalogram based brain-computer interfacing. Medical & biological engineering & computing, 37(1), 93-98. """ # Sanity checks if isinstance(signal, (np.ndarray, pd.DataFrame)) and signal.ndim > 1: raise ValueError( "Multidimensional inputs (e.g., matrices or multichannel data) are not supported yet." ) embedded = complexity_embedding(signal, delay=delay, dimension=dimension, show=show) W = np.linalg.svd(embedded, compute_uv=False) # Compute SVD W /= np.sum(W) # Normalize singular values return -1 * sum(W * np.log2(W)), {"Dimension": dimension, "Delay": delay}