TensorFlow 1 version
 | 
  
     
    View source on GitHub
  
 | 
Compute the Moore-Penrose pseudo-inverse of one or more matrices.
tf.linalg.pinv(
    a, rcond=None, validate_args=False, name=None
)
Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.
The pseudo-inverse of a matrix A, is defined as: 'the matrix that 'solves'
[the least-squares problem] A @ x = b,' i.e., if x_hat is a solution, then
A_pinv is the matrix such that x_hat = A_pinv @ b. It can be shown that if
U @ Sigma @ V.T = A is the singular value decomposition of A, then
A_pinv = V @ inv(Sigma) U^T. [(Strang, 1980)][1]
This function is analogous to numpy.linalg.pinv.
It differs only in default value of rcond. In numpy.linalg.pinv, the
default rcond is 1e-15. Here the default is
10. * max(num_rows, num_cols) * np.finfo(dtype).eps.
Args | |
|---|---|
a
 | 
(Batch of) float-like matrix-shaped Tensor(s) which are to be
pseudo-inverted.
 | 
rcond
 | 
Tensor of small singular value cutoffs.  Singular values smaller
(in modulus) than rcond * largest_singular_value (again, in modulus) are
set to zero. Must broadcast against tf.shape(a)[:-2].
Default value: 10. * max(num_rows, num_cols) * np.finfo(a.dtype).eps.
 | 
validate_args
 | 
When True, additional assertions might be embedded in the
graph.
Default value: False (i.e., no graph assertions are added).
 | 
name
 | 
Python str prefixed to ops created by this function.
Default value: 'pinv'.
 | 
Returns | |
|---|---|
a_pinv
 | 
(Batch of) pseudo-inverse of input a. Has same shape as a except
rightmost two dimensions are transposed.
 | 
Raises | |
|---|---|
TypeError
 | 
if input a does not have float-like dtype.
 | 
ValueError
 | 
if input a has fewer than 2 dimensions.
 | 
Examples
import tensorflow as tf
import tensorflow_probability as tfp
a = tf.constant([[1.,  0.4,  0.5],
                 [0.4, 0.2,  0.25],
                 [0.5, 0.25, 0.35]])
tf.matmul(tf.linalg..pinv(a), a)
# ==> array([[1., 0., 0.],
             [0., 1., 0.],
             [0., 0., 1.]], dtype=float32)
a = tf.constant([[1.,  0.4,  0.5,  1.],
                 [0.4, 0.2,  0.25, 2.],
                 [0.5, 0.25, 0.35, 3.]])
tf.matmul(tf.linalg..pinv(a), a)
# ==> array([[ 0.76,  0.37,  0.21, -0.02],
             [ 0.37,  0.43, -0.33,  0.02],
             [ 0.21, -0.33,  0.81,  0.01],
             [-0.02,  0.02,  0.01,  1.  ]], dtype=float32)
References
[1]: G. Strang. 'Linear Algebra and Its Applications, 2nd Ed.' Academic Press, Inc., 1980, pp. 139-142.
  TensorFlow 1 version
    View source on GitHub