Skip to content

← signal_processing package

IncrementalWhitening

Perform a whitening (sphering) transform of the signal incrementally.

This node progressively updates, over the course of a recording, a linear spatial transform that can be interpreted as a ZCA or decorrelation (and scaling to unit norm) of channels. The method supports shrinkage for rank-deficient and/or high-channel data, block updates for increased performance, riemannian or euclidean geometry (riemannian can work better for decent-quality but non-stationary data, but euclidean will likely be more resilient in the presence of bad-quality data). The method can also use robust (outlier-tolerant) updates, but note that this likely requires parameter tuning for the given data (while the non-robust mode uses optimal recursive updates). Robustness works best if the initial part of the data is reasonably clean since bad onset artifacts can potentially throw off the estimator. There is also an experimental mode that can track the principal subspace of the data more efficiently, although this should rarely be needed. Another advanced use case is that for very high-dimensional data, a spatial prior matrix can be passed in that encodes the likelihood of any two channels being correlated. This matrix can be obtained with the CovarianceTaper node. Version 1.0.0

Ports/Properties

data

Data to process.

  • verbose name: Data
  • default value: None
  • port type: DataPort
  • value type: Packet (can be None)
  • data direction: INOUT

spatial_taper

Spatial taper.

  • verbose name: Spatial Taper
  • default value: None
  • port type: DataPort
  • value type: Packet (can be None)
  • data direction: IN

subtract_mean

Subtract signal mean. If set to False, the signal must already be approx. zero mean (e.g., highpass filtered).

  • verbose name: Subtract Mean
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

regularization

Shrinkage regulariation strength. Larger values yield more conservative (but less adapted) whitening transforms. Typically only a very small value (e.g., 1e-6 to 1e-3) is necessary to avoid degenerate solutions. The Riemannian variants may require a slightly larger regularization.

  • verbose name: Regularization Strength
  • default value: 1e-06
  • port type: FloatPort
  • value type: float (can be None)

step_size

Step size when performing block updates. Processing performance at very high channel counts is increased by this factor. When selecting Riemann geometry (or blockwise Euclidean), then this is also used as the effective block size. When doing robust estimation, could be matched to the time scale of expected artifacts (e.g., 1-5 seconds), or, for Riemannian estimation, this may be set to be long enough to obtain good block covariance estimates.

  • verbose name: Step Size
  • default value: 1
  • port type: IntPort
  • value type: int (can be None)

step_size_unit

Unit for the step size value.

  • verbose name: Step Size Unit
  • default value: samples
  • port type: EnumPort
  • value type: str (can be None)

method

Method to use for sphereing. The typical choice is eigh. The pinv method is mostly included for reference (it works even if regularization is zero). The rhh method is experimental for the special case where only a lower-dimensional dominant subspace shall be tracked and fast per-sample updates are desired. This method can be more brittle in the presence of artifacts, and is not compatible robust and/or riemannian modes.

  • verbose name: Sphereing Method
  • default value: eigh
  • port type: EnumPort
  • value type: str (can be None)

geometry

Whether to average covariance matrices using a Riemannian assumption. This is theoretically a more ideal way to average covariance matrices, particularly in the presence of non-stationarity, but it can be more brittle due its need for well-behaved matrices in each block update (stepsize samples). The Euclidean (blockwise) mode can be chosen to use the same processing pathway as the Riemannian mode, except that the geometry is Euclidean.

  • verbose name: Geometry
  • default value: euclidean
  • port type: EnumPort
  • value type: str (can be None)

robust

Whether to use a robust estimator. When enabled, the Robbins-Monro algorithm is used, which is configured via the parameters rm_gamma, rm_alpha, and rm_sag. The type of estimator is configured using the huber_thresold parameter. These parameters can be somewhat finicky to tune and they interact. Some settings worth trying are: 1) sag=False, huber=0, gamma=median covariance deviation, alpha=1; 2) sag=True; huber=1.35*median covariance deviation, gamma=1.5 to 2.5, alpha=0.75.

  • verbose name: Robust
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

huber_threshold

Huber threshold, applies only when using a robust estimator. If set to 0, the geometric (or l1) median is used. This has the highest breakdown point (50% data corruption), but, like the median, it will effectively utilize the most central covariance matrix in the data sample (pooled across blocks or across samples), which may not be a good estimate if raw block estimates are low quality (e.g., estimated on too-short blocks). If set to >0, a Huber estimator is used. This value is then ideally set to a value that's some factor of the median deviation of each covariance matrix to the centroid (in terms of Euclidean or Riemannian distance), and a typical choice is 1.35x (which retains 95% of the variance). Due to the median deviation being data-specific, this needs to be tuned for a given study. If set to None, the non-robust least-squares estimator (i.e., mean covariance) is used, which can be used to assess convergence with a given set of gamma, sag and alpha parameters (comparing to the robust=False behavior, which uses the exact recursive mean). In verbose mode, this will print the per-sample deviation values, which can be used to set the huber threshold appropriately.

  • verbose name: Huber Threshold
  • default value: 0.0
  • port type: FloatPort
  • value type: float (can be None)

rm_sag

Use stochastic average gradient descent for robust estimation. In theory this causes the estimator to converge more quickly. However, on non-stationary time-series data and/or bad initial data (at the beginning of the recording), this can likely also backfire and make the other parmameters more difficult to tune.

  • verbose name: Stochastic Average Gradient
  • default value: True
  • port type: BoolPort
  • value type: bool (can be None)

rm_gamma

Gamma parameter (learning rate) of Robbins-Monro algorithm when using a robust method. To tune this parameter, several heuristics are available: 1) exponentially spaced grid search up to some multiple of the median covariance deviation, 2) a value near the covariance deviation (e.g., if huber=0, sag=False, alpha~1), 3) a value between 1 and 3, (if sag=True and alpha=0.75). Note that the deviation will differ starkly between sample-wise or block-wise covariance matrices, across different block sizes, as well as riemannian vs euclidean settings.

  • verbose name: Robust Learning Rate
  • default value: 2.0
  • port type: FloatPort
  • value type: float (can be None)

rm_alpha

Alpha parameter of Robbins-Monro algorithm when using a robust method. This parameter typically does not require much tuning, but can instead be set to close to or exactly 1 (if sag=False), or 3/4 (if sag=True). A setting of 2/3 has also been proposed for sag=True, but results may not differ much from the 3/4 setting.

  • verbose name: Robust Learning Rate Decay
  • default value: 0.75
  • port type: FloatPort
  • value type: float (can be None)

subspace_dim

Dimensionality of the subspace when using the rhh method. This can be an integer, or if <1 it is taken as a fraction of the number of channels. The compute time of the method is proportional to this.

  • verbose name: Subspace Dim
  • default value: None
  • port type: FloatPort
  • value type: float (can be None)

forget_factor

Forget factor when the rhh method is being used.

  • verbose name: Forget Factor
  • default value: 0.9999
  • port type: FloatPort
  • value type: float (can be None)

min_ev

Minimum eigenvalue threshold when inverting the covariance matrix. This can prevent errors when whitening data with very high channel counts on very little data.

  • verbose name: Min Ev
  • default value: None
  • port type: FloatPort
  • value type: float (can be None)

regularize_towards

Target matrix for regularization. The 'eye' option is the identity matrix, the 'scaled-eye' option is the identity matrix scaled to the average variance of the data, and the 'diag' option is a diagonal matrix with the same diagonal as the covariance matrix. This is mostly relevant for very high regularization values (>0.1).

  • verbose name: Regularize Towards
  • default value: diag
  • port type: EnumPort
  • value type: str (can be None)

update_on

Time range to initialize on. If two numbers are given, in seconds from the first sample, then the filter will be updated only on that sub-slice of the data.

  • verbose name: Update During This Time Range
  • default value: []
  • port type: ListPort
  • value type: list (can be None)

update_on_markers

List of markers on which to update. This can contain wildcard characters. This mode is useful if trials should not be interrupted by changes of the whitening matrix. Instead the node can be configured to update e.g., only after each trial has completed.

  • verbose name: Update On Markers
  • default value: []
  • port type: ListPort
  • value type: list (can be None)

apply_retroactive

Apply the transform retroactively to the segment that it was estimated on. This is all data since the last update. Note that this is not currently online capable, and would effectively only emit a chunk on each update.

  • verbose name: Apply Retroactive
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

warnings_as_errors

Treat numerics warnings as errors. This applies when invalid eigenvalues (usually due to rank-deficient matrices) occur in the data, which can help detect potential issues early during processing.

  • verbose name: Warnings As Errors
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

nan_check

Check for NaN or infinity values.

  • verbose name: Nan Check
  • default value: True
  • port type: BoolPort
  • value type: bool (can be None)

ignore_resets

Ignore signal resets.

  • verbose name: Ignore Resets
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

backend

Compute backend to use. The cupy and torch backends can be faster on data with many channels (e.g., >500) and if the system has a CUDA-capable GPU installed. Keep means to use whatever was used to create the incoming data.

  • verbose name: Backend
  • default value: keep
  • port type: EnumPort
  • value type: str (can be None)

precision

Numeric precision to use. Can be reduced to save memory (e.g. if running on GPU). Only needed for the largest of problems, and only used by the geometric and huber centroids.

  • verbose name: Precision
  • default value: keep
  • port type: EnumPort
  • value type: str (can be None)

use_caching

Use caching.

  • verbose name: Use Caching
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

verbose

Use verbose output.

  • verbose name: Verbose
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

Print interval in seconds for verbose output.

  • verbose name: Print Interval
  • default value: 30
  • port type: IntPort
  • value type: int (can be None)

channel_grouping

Optional channel grouping. Given as a list/vector of group indices per channel (0-based). Whitening will only take place within each group. This can also be set to True to effectively perform adaptive per-channel scaling with no decorrelation.

  • verbose name: Channel Grouping
  • default value: None
  • port type: Port
  • value type: object (can be None)

group_average

Average the whitening coefficients across groups. This effectively forces channels in different groups to share the same whitening. This requires equal-sized groups, and channels must be sorted in a compatible (e.g., identical) order in each groups.

  • verbose name: Identical Across Groups
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

set_breakpoint

Set a breakpoint on this node. If this is enabled, your debugger (if one is attached) will trigger a breakpoint.

  • verbose name: Set Breakpoint (Debug Only)
  • default value: False
  • port type: BoolPort
  • value type: bool (can be None)

metadata

User-definable meta-data associated with the node. Usually reserved for technical purposes.

  • verbose name: Metadata
  • default value: {}
  • port type: DictPort
  • value type: dict (can be None)