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. |
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)
[1]: G. Strang. 'Linear Algebra and Its Applications, 2nd Ed.' Academic Press, Inc., 1980, pp. 139-142.
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/linalg/pinv