tick.prox.ProxNuclear(strength: float, n_rows: int = None, range: tuple = None, positive: bool = False)[source]¶Proximal operator of the nuclear norm, aka trace norm
strength : float
Level of penalization
n_rows : int
Number of rows in the matrix on which we apply this penalization. The number of columns is then given by (start - end) / n_rows
range : tuple of two int, default=`None`
Range on which the prox is applied. If
Nonethen the prox is applied on the whole vector
positive : bool, default=`False`
If True, apply nuclear-norm penalization followed by a truncation to make all entries non-negative
rank_max : int, default=`None`
Maximum rank to be used in the SVD (not used yet…)
Notes
The coeffs on which we apply this prox must be flattened (using
np.ravel for instance), and not two-dimensional.
This operator is not usable from a solver with wrapped C++ code.
It is based on scipy.linalg.svd SVD routine and is not intended
for use on large matrices
__init__(strength: float, n_rows: int = None, range: tuple = None, positive: bool = False)[source]¶Initialize self. See help(type(self)) for accurate signature.
call(coeffs, step=1.0, out=None)¶Apply proximal operator on a vector. It computes:
coeffs : numpy.ndarray, shape=(n_coeffs,)
Input vector on which is applied the proximal operator
step : float or np.array, default=1.
The amount of penalization is multiplied by this amount
If
float, the amount of penalization is multiplied by this amount
If
np.array, then each coordinate of coeffs (within the given range), receives an amount of penalization multiplied by t (available only for separable prox)
out : numpy.ndarray, shape=(n_params,), default=None
If not
None, the output is stored in the givenout. Otherwise, a new vector is created.
output : numpy.ndarray, shape=(n_coeffs,)
Same object as out
Notes
step must have the same size as coeffs whenever range is
None, or a size matching the one given by the range
otherwise