Source code for pyproximal.projection.L1
import numpy as np
from pyproximal.projection import SimplexProj
[docs]class L1BallProj():
r""":math:`L_1` ball projection.
Parameters
----------
n : :obj:`int`
Number of elements of input vector
radius : :obj:`float`
Radius
maxiter : :obj:`int`, optional
Maximum number of iterations used by :func:`scipy.optimize.bisect`
xtol : :obj:`float`, optional
Absolute tolerance of :func:`scipy.optimize.bisect`
Notes
-----
Given an L1 ball defined as:
.. math::
L1_{r} = \{ \mathbf{x}: ||\mathbf{x}||_1 \leq r \}
its orthogonal projection is:
.. math::
P_{L1_{r}} (\mathbf{x}) = sign(\mathbf{x}) P_{\operatorname{Simplex}(r)}(\mathbf{x})
Note that this is the proximal operator of the corresponding
indicator function :math:`\mathcal{I}_{L1_{r}}`.
"""
def __init__(self, n, radius, maxiter=100, xtol=1e-5):
self.n = n
self.radius = radius
self.simplex = SimplexProj(n, radius, maxiter, xtol)
def __call__(self, x):
if np.iscomplexobj(x):
return np.exp(1j * np.angle(x)) * self.simplex(np.abs(x))
else:
return np.sign(x) * self.simplex(np.abs(x))