procrustes.utils

Utility Module.

procrustes.utils.compute_error(a: ndarray, b: ndarray, t: ndarray, s: ndarray | None = None) float[source]

Return the one- or two-sided Procrustes (squared Frobenius norm) error.

The double-sided Procrustes error is defined as

\[\|\mathbf{S}\mathbf{A}\mathbf{T} - \mathbf{B}\|_{F}^2 = \text{Tr}\left[ \left(\mathbf{S}\mathbf{A}\mathbf{T} - \mathbf{B}\right)^\dagger \left(\mathbf{S}\mathbf{A}\mathbf{T} - \mathbf{B}\right)\right]\]

when \(\mathbf{S}\) is the identity matrix \(\mathbf{I}\), this is called the one-sided Procrustes error.

Parameters:
  • a (ndarray) -- The 2D-array \(\mathbf{A}_{m \times n}\) which is going to be transformed.

  • b (ndarray) -- The 2D-array \(\mathbf{B}_{m \times n}\) representing the reference matrix.

  • t (ndarray) -- The 2D-array \(\mathbf{T}_{n \times n}\) representing the right-hand-side transformation matrix.

  • s (ndarray, optional) -- The 2D-array \(\mathbf{S}_{m \times m}\) representing the left-hand-side transformation matrix. If set to None, the one-sided Procrustes error is computed.

Returns:

error -- The squared Frobenius norm of difference between the transformed array, \(\mathbf{S} \mathbf{A}\mathbf{T}\), and the reference array, \(\mathbf{B}\).

Return type:

float

procrustes.utils.setup_input_arrays(array_a: ndarray, array_b: ndarray, remove_zero_col: bool, remove_zero_row: bool, pad: bool, translate: bool, scale: bool, check_finite: bool, weight: ndarray | None = None) Tuple[ndarray, ndarray][source]

Check and process array inputs for the Procrustes transformation routines.

Usually, the precursor step before all Procrustes methods.

Parameters:
  • array_a (npdarray) -- The 2D array \(A\) being transformed.

  • array_b (npdarray) -- The 2D reference array \(B\).

  • remove_zero_col (bool) -- If True, zero columns (values less than 1e-8) on the right side will be removed.

  • remove_zero_row (bool) -- If True, zero rows (values less than 1e-8) on the bottom will be removed.

  • pad (bool) -- Add zero rows (at the bottom) and/or columns (to the right-hand side) of matrices \(\mathbf{A}\) and \(\mathbf{B}\) so that they have the same shape.

  • translate (bool) -- If true, then translate both arrays \(A, B\) to the origin, ie columns of the arrays will have mean zero.

  • scale -- If True, both arrays are normalized to one with respect to the Frobenius norm, ie \(Tr(A^T A) = 1\).

  • check_finite (bool) -- If true, then checks if both arrays \(A, B\) are numpy arrays and two-dimensional.

  • weight (A list of ndarray or ndarray) -- A list of the weight arrays or one numpy array. When only on numpy array provided, it is assumed that the two arrays \(A\) and \(B\) share the same weight matrix.

Returns:

Returns the padded arrays, in that they have the same matrix dimensions.

Return type:

(ndarray, ndarray)

class procrustes.utils.ProcrustesResult[source]

Represents the Procrustes analysis result.

error

The Procrustes (squared Frobenius norm) error.

Type:

float

new_a

The translated/scaled numpy ndarray \(\mathbf{A}\).

Type:

ndarray

new_b

The translated/scaled numpy ndarray \(\mathbf{B}\).

Type:

ndarray

t

The 2D-array \(\mathbf{T}\) representing the right-hand-side transformation matrix.

Type:

ndarray

s

The 2D-array \(\mathbf{S}\) representing the left-hand-side transformation matrix. If set to None, the one-sided Procrustes was performed.

Type:

ndarray

Methods

clear()

copy()

fromkeys(iterable[, value])

Create a new dictionary with keys from iterable and values set to value.

get(key[, default])

Return the value for key if key is in the dictionary, else default.

items()

keys()

pop(key[, default])

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem(/)

Remove and return a (key, value) pair as a 2-tuple.

setdefault(key[, default])

Insert key with a value of default if key is not in the dictionary.

update([E, ]**F)

If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()