Aliases:
tf.linalg.svd
tf.svd
tf.linalg.svd(
tensor,
full_matrices=False,
compute_uv=True,
name=None
)
Defined in tensorflow/python/ops/linalg_ops.py
.
Computes the singular value decompositions of one or more matrices.
Computes the SVD of each inner matrix in tensor
such that
tensor[..., :, :] = u[..., :, :] * diag(s[..., :, :]) *
transpose(conj(v[..., :, :]))
# a is a tensor.
# s is a tensor of singular values.
# u is a tensor of left singular vectors.
# v is a tensor of right singular vectors.
s, u, v = svd(a)
s = svd(a, compute_uv=False)
Args:
tensor
:Tensor
of shape[..., M, N]
. LetP
be the minimum ofM
andN
.full_matrices
: If true, compute full-sizedu
andv
. If false (the default), compute only the leadingP
singular vectors. Ignored ifcompute_uv
isFalse
.compute_uv
: IfTrue
then left and right singular vectors will be computed and returned inu
andv
, respectively. Otherwise, only the singular values will be computed, which can be significantly faster.name
: string, optional name of the operation.
Returns:
s
: Singular values. Shape is[..., P]
. The values are sorted in reverse order of magnitude, so s[..., 0] is the largest value, s[..., 1] is the second largest, etc.u
: Left singular vectors. Iffull_matrices
isFalse
(default) then shape is[..., M, P]
; iffull_matrices
isTrue
then shape is[..., M, M]
. Not returned ifcompute_uv
isFalse
.v
: Right singular vectors. Iffull_matrices
isFalse
(default) then shape is[..., N, P]
. Iffull_matrices
isTrue
then shape is[..., N, N]
. Not returned ifcompute_uv
isFalse
.
Numpy Compatibility
Mostly equivalent to numpy.linalg.svd, except that
* The order of output arguments here is s
, u
, v
when compute_uv
is
True
, as opposed to u
, s
, v
for numpy.linalg.svd.
* full_matrices is False
by default as opposed to True
for
numpy.linalg.svd.
* tf.linalg.svd uses the standard definition of the SVD
\(A = U \Sigma V^H\), such that the left singular vectors of a
are
the columns of u
, while the right singular vectors of a
are the
columns of v
. On the other hand, numpy.linalg.svd returns the adjoint
\(V^H\) as the third output argument.
import tensorflow as tf
import numpy as np
s, u, v = tf.linalg.svd(a)
tf_a_approx = tf.matmul(u, tf.matmul(tf.linalg.diag(s), v, adjoint_b=True))
u, s, v_adj = np.linalg.svd(a, full_matrices=False)
np_a_approx = np.dot(u, np.dot(np.diag(s), v_adj))
# tf_a_approx and np_a_approx should be numerically close.