Previous topic

numpy.linalg.inv

Next topic

numpy.linalg.tensorinv

This is documentation for an old release of NumPy (version 1.13). Read this page in the documentation of the latest stable release (version 2.2).

numpy.linalg.pinv

numpy.linalg.pinv(a, rcond=1e-15)[source]

Compute the (Moore-Penrose) pseudo-inverse of a matrix.

Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.

Parameters:

a : (M, N) array_like

Matrix to be pseudo-inverted.

rcond : float

Cutoff for small singular values. Singular values smaller (in modulus) than rcond * largest_singular_value (again, in modulus) are set to zero.

Returns:

B : (N, M) ndarray

The pseudo-inverse of a. If a is a matrix instance, then so is B.

Raises:

LinAlgError

If the SVD computation does not converge.

Notes

The pseudo-inverse of a matrix A, denoted A^+, is defined as: “the matrix that ‘solves’ [the least-squares problem] Ax = b,” i.e., if \bar{x} is said solution, then A^+ is that matrix such that \bar{x} = A^+b.

It can be shown that if Q_1 \Sigma Q_2^T = A is the singular value decomposition of A, then A^+ = Q_2 \Sigma^+ Q_1^T, where Q_{1,2} are orthogonal matrices, \Sigma is a diagonal matrix consisting of A’s so-called singular values, (followed, typically, by zeros), and then \Sigma^+ is simply the diagonal matrix consisting of the reciprocals of A’s singular values (again, followed by zeros). [R47]

References

[R47](1, 2) G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, pp. 139-142.

Examples

The following example checks that a * a+ * a == a and a+ * a * a+ == a+:

>>> a = np.random.randn(9, 6)
>>> B = np.linalg.pinv(a)
>>> np.allclose(a, np.dot(a, np.dot(B, a)))
True
>>> np.allclose(B, np.dot(B, np.dot(a, B)))
True