CP Alternating Least Squares (pyttb.cp_als)

For all examples in this document, the following module imports are assumed:

>>> import pyttb as ttb
>>> import numpy as np
pyttb.cp_als(input_tensor: tensor | sptensor | ttensor | sumtensor, rank: int, stoptol: float = 0.0001, maxiters: int = 1000, dimorder: int | float | Iterable[int] | Iterable[float] | ndarray | None = None, optdims: int | float | Iterable[int] | Iterable[float] | ndarray | None = None, init: Literal['random'] | Literal['nvecs'] | ktensor = 'random', printitn: int = 1, fixsigns: bool = True) → tuple[ktensor, ktensor, dict][source]

Compute CP decomposition with alternating least squares.

Parameters:
  • input_tensor – Tensor to decompose

  • rank – Rank of the decomposition

  • stoptol – Tolerance used for termination - when the change in the fitness function in successive iterations drops below this value, the iterations terminate

  • dimorder – Order to loop through dimensions (default: [range(tensor.ndims)])

  • optdims – Whether factor for corresponding mode should be optimized or not. Defaults to optimizing all modes ([range(tensor.ndims)]).

  • maxiters – Maximum number of iterations

  • init –

    Initial guess (default: “random”)
    • “random”: initialize using a pyttb.ktensor with values chosen

      from a Normal distribution with mean 0 and standard deviation 1

    • “nvecs”: initialize factor matrices of a pyttb.ktensor using

      the eigenvectors of the outer product of the matricized input tensor

    • pyttb.ktensor: initialize using a specific

      pyttb.ktensor as input - must be the same shape as the input tensor and have the same rank as the input rank

  • printitn – Number of iterations to perform before printing iteration status - 0 for no status printing

  • fixsigns – Align the signs of the columns of the factorization to align with the input tensor data

Returns:

  • M – Resulting ktensor from CP-ALS factorization

  • Minit – Initial guess

  • output –

    Information about the computation. Dictionary keys:
    • params : tuple of (stoptol, maxiters, printitn, dimorder)

    • iters: number of iterations performed

    • normresidual: norm of the difference between the input tensor

      and ktensor factorization

    • fit: value of the fitness function (fraction of tensor data

      explained by the model)

Example

Random initialization causes slight perturbation in intermediate results. … is our place holder for these numeric values. Example using default values (“random” initialization):

>>> weights = np.array([1., 2.])
>>> fm0 = np.array([[1., 2.], [3., 4.]])
>>> fm1 = np.array([[5., 6.], [7., 8.]])
>>> K = ttb.ktensor([fm0, fm1], weights)
>>> np.random.seed(1)
>>> M, Minit, output = ttb.cp_als(K.full(), 2)
CP_ALS:
 Iter 0: f = ... f-delta = ...
 Iter 1: f = ... f-delta = ...
 Final f = ...
>>> print(M)
ktensor of shape (2, 2) with order F
weights=[108.4715... 8.6114...]
factor_matrices[0] =
[[0.4187... 0.3989...]
 [0.9080... 0.9169...]]
factor_matrices[1] =
[[0.6188... 0.2581...]
 [0.7854... 0.9661...]]
>>> print(Minit)
ktensor of shape (2, 2) with order F
weights=[1. 1.]
factor_matrices[0] =
[[4.1702...e-01 7.2032...e-01]
 [1.1437...e-04 3.0233...e-01]]
factor_matrices[1] =
[[0.1467... 0.0923...]
 [0.1862... 0.3455...]]
>>> print(output["params"])
{'stoptol': 0.0001, 'maxiters': 1000, 'dimorder': array([0, 1]),     'optdims': array([0, 1]), 'printitn': 1, 'fixsigns': True}

Example using “nvecs” initialization:

>>> M, Minit, output = ttb.cp_als(K.full(), 2, init="nvecs")
CP_ALS:
 Iter 0: f = ... f-delta = ...
 Iter 1: f = ... f-delta = ...
 Final f = ...

Example using pyttb.ktensor initialization:

>>> M, Minit, output = ttb.cp_als(K.full(), 2, init=K)
CP_ALS:
 Iter 0: f = ... f-delta = ...
 Iter 1: f = ... f-delta = ...
 Final f = ...