def pinv(a, rcond=1e-15): """ 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 : array_like (M, N) Matrix to be pseudo-inverted. rcond : float Cutoff for `small` singular values. Singular values smaller than rcond*largest_singular_value are considered zero. Returns ------- B : ndarray (N, M) The pseudo-inverse of `a`. If `a` is an np.matrix instance, then so is `B`. Raises ------ LinAlgError In case SVD computation does not converge. Examples -------- >>> 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 """ a, wrap = _makearray(a) _assertNonEmpty(a) a = a.conjugate() u, s, vt = svd(a, 0) m = u.shape[0] n = vt.shape[1] cutoff = rcond * maximum.reduce(s) for i in range(min(n, m)): if s[i] > cutoff: s[i] = 1. / s[i] else: s[i] = 0. res = dot(transpose(vt), multiply(s[:, newaxis], transpose(u))) return wrap(res)
def pinv(a, rcond=1e-15 ): """ 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 : array_like (M, N) Matrix to be pseudo-inverted. rcond : float Cutoff for `small` singular values. Singular values smaller than rcond*largest_singular_value are considered zero. Returns ------- B : ndarray (N, M) The pseudo-inverse of `a`. If `a` is an np.matrix instance, then so is `B`. Raises ------ LinAlgError In case SVD computation does not converge. Examples -------- >>> 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 """ a, wrap = _makearray(a) _assertNonEmpty(a) a = a.conjugate() u, s, vt = svd(a, 0) m = u.shape[0] n = vt.shape[1] cutoff = rcond*maximum.reduce(s) for i in range(min(n, m)): if s[i] > cutoff: s[i] = 1./s[i] else: s[i] = 0.; res = dot(transpose(vt), multiply(s[:, newaxis],transpose(u))) return wrap(res)
def pinv(a, rcond=1e-15 ): """Compute the (Moore-Penrose) pseudo-inverse of a matrix. Calculate a generalized inverse of a matrix using its singular-value decomposition and including all 'large' singular values. Parameters ---------- a : array-like, shape (M, N) Matrix to be pseudo-inverted rcond : float Cutoff for 'small' singular values. Singular values smaller than rcond*largest_singular_value are considered zero. Returns ------- B : array, shape (N, M) If a is a matrix, then so is B. Raises LinAlgError if SVD computation does not converge Examples -------- >>> from numpy import * >>> a = random.randn(9, 6) >>> B = linalg.pinv(a) >>> allclose(a, dot(a, dot(B, a))) True >>> allclose(B, dot(B, dot(a, B))) True """ a, wrap = _makearray(a) _assertNonEmpty(a) a = a.conjugate() u, s, vt = svd(a, 0) m = u.shape[0] n = vt.shape[1] cutoff = rcond*maximum.reduce(s) for i in range(min(n, m)): if s[i] > cutoff: s[i] = 1./s[i] else: s[i] = 0.; res = dot(transpose(vt), multiply(s[:, newaxis],transpose(u))) return wrap(res)
def pinv(a, rcond=1e-15): """Compute the (Moore-Penrose) pseudo-inverse of a matrix. Calculate a generalized inverse of a matrix using its singular-value decomposition and including all 'large' singular values. Parameters ---------- a : array-like, shape (M, N) Matrix to be pseudo-inverted rcond : float Cutoff for 'small' singular values. Singular values smaller than rcond*largest_singular_value are considered zero. Returns ------- B : array, shape (N, M) If a is a matrix, then so is B. Raises LinAlgError if SVD computation does not converge Examples -------- >>> from numpy import * >>> a = random.randn(9, 6) >>> B = linalg.pinv(a) >>> allclose(a, dot(a, dot(B, a))) True >>> allclose(B, dot(B, dot(a, B))) True """ a, wrap = _makearray(a) _assertNonEmpty(a) a = a.conjugate() u, s, vt = svd(a, 0) m = u.shape[0] n = vt.shape[1] cutoff = rcond * maximum.reduce(s) for i in range(min(n, m)): if s[i] > cutoff: s[i] = 1. / s[i] else: s[i] = 0. res = dot(transpose(vt), multiply(s[:, newaxis], transpose(u))) return wrap(res)
def pinv(a, rcond=1e-15): """Return the (Moore-Penrose) pseudo-inverse of a 2-d array This method computes the generalized inverse using the singular-value decomposition and all singular values larger than rcond of the largest. """ a, wrap = _makearray(a) _assertNonEmpty(a) a = a.conjugate() u, s, vt = svd(a, 0) m = u.shape[0] n = vt.shape[1] cutoff = rcond * maximum.reduce(s) for i in range(min(n, m)): if s[i] > cutoff: s[i] = 1. / s[i] else: s[i] = 0. return wrap(dot(transpose(vt), multiply(s[:, newaxis], transpose(u))))
def pinv(a, rcond=1e-15 ): """Return the (Moore-Penrose) pseudo-inverse of a 2-d array This method computes the generalized inverse using the singular-value decomposition and all singular values larger than rcond of the largest. """ a, wrap = _makearray(a) a = a.conjugate() u, s, vt = svd(a, 0) m = u.shape[0] n = vt.shape[1] cutoff = rcond*maximum.reduce(s) for i in range(min(n, m)): if s[i] > cutoff: s[i] = 1./s[i] else: s[i] = 0.; return wrap(dot(transpose(vt), multiply(s[:, newaxis],transpose(u))))
def _rc(s, tolerance): cutoff = tolerance * maximum.reduce(s) return cutoff