tensorly.decomposition
.Parafac2
- class Parafac2(rank, n_iter_max=2000, init='random', svd='truncated_svd', normalize_factors=False, tol=1e-08, nn_modes=None, random_state=None, verbose=False, return_errors=False, n_iter_parafac=5, linesearch=False)[source]
PARAFAC2 decomposition [1] of a third order tensor via alternating least squares (ALS)
Computes a rank-rank PARAFAC2 decomposition of the third-order tensor defined by tensor_slices. The decomposition is on the form \((A [B_i] C)\) such that the i-th frontal slice, \(X_i\), of \(X\) is given by
\[X_i = B_i diag(a_i) C^T,\]where \(diag(a_i)\) is the diagonal matrix whose nonzero entries are equal to the \(i\)-th row of the \(I \times R\) factor matrix \(A\), \(B_i\) is a \(J_i \times R\) factor matrix such that the cross product matrix \(B_{i_1}^T B_{i_1}\) is constant for all \(i\), and \(C\) is a \(K \times R\) factor matrix. To compute this decomposition, we reformulate the expression for \(B_i\) such that
\[B_i = P_i B,\]where \(P_i\) is a \(J_i \times R\) orthogonal matrix and \(B\) is a \(R \times R\) matrix.
An alternative formulation of the PARAFAC2 decomposition is that the tensor element \(X_{ijk}\) is given by
\[X_{ijk} = \sum_{r=1}^R A_{ir} B_{ijr} C_{kr},\]with the same constraints hold for \(B_i\) as above.
- Parameters:
- rankint
Number of components.
- n_iter_maxint, optional
(Default: 2000) Maximum number of iteration
Changed in version 0.6.1: Previously, the default maximum number of iterations was 100.
- init{‘svd’, ‘random’, CPTensor, Parafac2Tensor}
Type of factor matrix initialization. See initialize_factors.
- svdstr, default is ‘truncated_svd’
function to use to compute the SVD, acceptable values in tensorly.SVD_FUNS
- normalize_factorsbool (optional)
If True, aggregate the weights of each factor in a 1D-tensor of shape (rank, ), which will contain the norms of the factors. Note that there may be some inaccuracies in the component weights.
- tolfloat, optional
(Default: 1e-8) Relative reconstruction error decrease tolerance. The algorithm is considered to have converged when \(\left|\| X - \hat{X}_{n-1} \|^2 - \| X - \hat{X}_{n} \|^2\right| < \epsilon \| X - \hat{X}_{n-1} \|^2\). That is, when the relative change in sum of squared error is less than the tolerance.
Changed in version 0.6.1: Previously, the stopping condition was \(\left|\| X - \hat{X}_{n-1} \| - \| X - \hat{X}_{n} \|\right| < \epsilon\).
- nn_modes: None, ‘all’ or array of integers
(Default: None) Used to specify which modes to impose non-negativity constraints on. We cannot impose non-negativity constraints on the the B-mode (mode 1) with the ALS algorithm, so if this mode is among the constrained modes, then a warning will be shown (see notes for more info).
- random_state{None, int, np.random.RandomState}
- verboseint, optional
Level of verbosity
- return_errorsbool, optional
Activate return of iteration errors
- n_iter_parafacint, optional
Number of PARAFAC iterations to perform for each PARAFAC2 iteration
- Returns:
- Parafac2Tensor(weight, factors, projection_matrices)
- weights1D array of shape (rank, )
all ones if normalize_factors is False (default), weights of the (normalized) factors otherwise
- factorsList of factors of the CP decomposition element i is of shape
(tensor.shape[i], rank)
- projection_matricesList of projection matrices used to create evolving
factors.
Notes
This formulation of the PARAFAC2 decomposition is slightly different from the one in [1]. The difference lies in that, here, the second mode changes over the first mode, whereas in [1], the second mode changes over the third mode. This change allows the function to accept both lists of matrices and a single nd-array as input without any mode reordering.
References
- fit_transform(tensor)[source]
Decompose an input tensor
- Parameters:
- tensortensorly.tensor
- Returns:
- self