Source code for sporco.prox._nuclear
# -*- coding: utf-8 -*-
# Copyright (C) 2015-2018 by Brendt Wohlberg <brendt@ieee.org>
# All rights reserved. BSD 3-clause License.
# This file is part of the SPORCO package. Details of the copyright
# and user license can be found in the 'LICENSE.txt' file distributed
# with the package.
r"""Compute the nuclear norm and its proximal operator"""
from __future__ import division
import numpy as np
from sporco.array import promote16
__author__ = """Brendt Wohlberg <brendt@ieee.org>"""
[docs]
def norm_nuclear(X):
r"""Compute the nuclear norm
.. math::
\| X \|_* = \sum_i \sigma_i
where :math:`\sigma_i` are the singular values of matrix :math:`X`.
Parameters
----------
X : array_like
Input array :math:`X`
Returns
-------
nncl : float
Nuclear norm of `X`
"""
return np.sum(np.linalg.svd(promote16(X), compute_uv=False))
[docs]
def prox_nuclear(V, alpha):
r"""Proximal operator of the nuclear norm :cite:`cai-2010-singular`
with parameter :math:`\alpha`.
Parameters
----------
v : array_like
Input array :math:`V`
alpha : float
Parameter :math:`\alpha`
Returns
-------
X : ndarray
Output array
s : ndarray
Singular values of `X`
"""
Usvd, s, Vsvd = promote16(V, fn=np.linalg.svd, full_matrices=False)
ss = np.maximum(0, s - alpha)
return np.dot(Usvd, np.dot(np.diag(ss), Vsvd)), ss