svds(A, k=6, ncv=None, tol=0, which='LM', v0=None, maxiter=None, return_singular_vectors=True, solver='arpack', random_state=None, options=None)
Compute the largest or smallest k
singular values and corresponding singular vectors of a sparse matrix A
. The order in which the singular values are returned is not guaranteed.
In the descriptions below, let M, N = A.shape
.
This is a naive implementation using ARPACK or LOBPCG as an eigensolver on A.conj().T @ A
or A @ A.conj().T
, depending on which one is more efficient.
Matrix to decompose.
Number of singular values and singular vectors to compute. Must satisfy 1 <= k <= kmax
, where kmax=min(M, N)
for solver='propack'
and kmax=min(M, N) - 1
otherwise.
When solver='arpack'
, this is the number of Lanczos vectors generated. See 'arpack' <sparse.linalg.svds-arpack>
for details. When solver='lobpcg'
or solver='propack'
, this parameter is ignored.
Tolerance for singular values. Zero (default) means machine precision.
Which k
singular values to find: either the largest magnitude ('LM') or smallest magnitude ('SM') singular values.
The starting vector for iteration; see method-specific documentation ( 'arpack' <sparse.linalg.svds-arpack>
, 'lobpcg' <sparse.linalg.svds-lobpcg>
), or 'propack' <sparse.linalg.svds-propack>
for details.
Maximum number of iterations; see method-specific documentation ( 'arpack' <sparse.linalg.svds-arpack>
, 'lobpcg' <sparse.linalg.svds-lobpcg>
), or 'propack' <sparse.linalg.svds-propack>
for details.
Singular values are always computed and returned; this parameter controls the computation and return of singular vectors.
True
: return singular vectors.
False
: do not return singular vectors.
"u"
: if M <= N
, compute only the left singular vectors and return None
for the right singular vectors. Otherwise, compute all singular vectors.
"vh"
: if M > N
, compute only the right singular vectors and return None
for the left singular vectors. Otherwise, compute all singular vectors.
If solver='propack'
, the option is respected regardless of the matrix shape.
The solver used. 'arpack' <sparse.linalg.svds-arpack>
, 'lobpcg' <sparse.linalg.svds-lobpcg>
, and 'propack' <sparse.linalg.svds-propack>
are supported. Default: :None:None:`'arpack'`
.
numpy.random.RandomState
}, optional
Pseudorandom number generator state used to generate resamples.
If random_state
is None
(or :None:None:`np.random`
), the numpy.random.RandomState
singleton is used. If random_state
is an int, a new RandomState
instance is used, seeded with random_state
. If random_state
is already a Generator
or RandomState
instance then that instance is used.
A dictionary of solver-specific options. No solver-specific options are currently supported; this parameter is reserved for future use.
Unitary matrix having left singular vectors as columns.
The singular values.
Unitary matrix having right singular vectors as rows.
Partial singular value decomposition of a sparse matrix.
Construct a matrix A
from singular values and vectors.
>>> from scipy.stats import ortho_group
... from scipy.sparse import csc_matrix, diags
... from scipy.sparse.linalg import svds
... rng = np.random.default_rng()
... orthogonal = csc_matrix(ortho_group.rvs(10, random_state=rng))
... s = [0.0001, 0.001, 3, 4, 5] # singular values
... u = orthogonal[:, :5] # left singular vectors
... vT = orthogonal[:, 5:].T # right singular vectors
... A = u @ diags(s) @ vT
With only three singular values/vectors, the SVD approximates the original matrix.
>>> u2, s2, vT2 = svds(A, k=3)
... A2 = u2 @ np.diag(s2) @ vT2
... np.allclose(A2, A.toarray(), atol=1e-3) True
With all five singular values/vectors, we can reproduce the original matrix.
>>> u3, s3, vT3 = svds(A, k=5)
... A3 = u3 @ np.diag(s3) @ vT3
... np.allclose(A3, A.toarray()) True
The singular values match the expected singular values, and the singular vectors are as expected up to a difference in sign.
>>> (np.allclose(s3, s) and
... np.allclose(np.abs(u3), np.abs(u.toarray())) and
... np.allclose(np.abs(vT3), np.abs(vT.toarray()))) True
The singular vectors are also orthogonal. >>> (np.allclose(u3.T @ u3, np.eye(5)) and ... np.allclose(vT3 @ vT3.T, np.eye(5))) True
See :The following pages refer to to this document either explicitly or contain code examples using this.
scipy.sparse.linalg._eigen.arpack.arpack.eigs
scipy.sparse.linalg._eigen.arpack.arpack.eigsh
scipy.sparse.linalg
scipy.sparse.linalg._eigen._svds.svds
Hover to see nodes names; edges to Self not shown, Caped at 50 nodes.
Using a canvas is more power efficient and can get hundred of nodes ; but does not allow hyperlinks; , arrows or text (beyond on hover)
SVG is more flexible but power hungry; and does not scale well to 50 + nodes.
All aboves nodes referred to, (or are referred from) current nodes; Edges from Self to other have been omitted (or all nodes would be connected to the central node "self" which is not useful). Nodes are colored by the library they belong to, and scaled with the number of references pointing them