torch.pinverse¶

torch.pinverse(input, rcond=1e-15) → Tensor

Calculates the pseudo-inverse (also known as the Moore-Penrose inverse) of a 2D tensor. Please look at Moore-Penrose inverse for more details

Note

This method is implemented using the Singular Value Decomposition.

Note

The pseudo-inverse is not necessarily a continuous function in the elements of the matrix [1]. Therefore, derivatives are not always existent, and exist for a constant rank only [2]. However, this method is backprop-able due to the implementation by using SVD results, and could be unstable. Double-backward will also be unstable due to the usage of SVD internally. See svd() for more details.

Parameters
• input (Tensor) – The input tensor of size $(*, m, n)$ where $*$ is zero or more batch dimensions

• rcond (float) – A floating point value to determine the cutoff for small singular values. Default: 1e-15

Returns

The pseudo-inverse of input of dimensions $(*, n, m)$

Example:

>>> input = torch.randn(3, 5)
>>> input
tensor([[ 0.5495,  0.0979, -1.4092, -0.1128,  0.4132],
[-1.1143, -0.3662,  0.3042,  1.6374, -0.9294],
[-0.3269, -0.5745, -0.0382, -0.5922, -0.6759]])
>>> torch.pinverse(input)
tensor([[ 0.0600, -0.1933, -0.2090],
[-0.0903, -0.0817, -0.4752],
[-0.7124, -0.1631, -0.2272],
[ 0.1356,  0.3933, -0.5023],
[-0.0308, -0.1725, -0.5216]])
>>> # Batched pinverse example
>>> a = torch.randn(2,6,3)
>>> b = torch.pinverse(a)
>>> torch.matmul(b, a)
tensor([[[ 1.0000e+00,  1.6391e-07, -1.1548e-07],
[ 8.3121e-08,  1.0000e+00, -2.7567e-07],
[ 3.5390e-08,  1.4901e-08,  1.0000e+00]],

[[ 1.0000e+00, -8.9407e-08,  2.9802e-08],
[-2.2352e-07,  1.0000e+00,  1.1921e-07],
[ 0.0000e+00,  8.9407e-08,  1.0000e+00]]])