svd¶
计算一个或一批矩阵的奇异值分解。
记 \(X\) 为一个矩阵,则计算的结果为 2 个矩阵 \(U\), \(VH\) 和一个向量 \(S\)。则分解后满足公式:
\[X = U * diag(S) * VH\]
值得注意的是,\(S\) 是向量,从大到小表示每个奇异值。而 \(VH\) 则是 V 的共轭转置。
参数¶
x (Tensor) - 输入的欲进行奇异值分解的一个或一批方阵,类型为 Tensor。
x
的形状应为[*, M, N]
,其中*
为零或更大的批次维度,数据类型支持 float32, float64。full_matrices (bool) - 是否计算完整的 U 和 V 矩阵,类型为 bool 默认为 False。这个参数会影响 U 和 V 生成的 Shape。
name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。
返回¶
Tensor U,奇异值分解的 U 矩阵。如果 full_matrics 设置为 False,则 Shape 为
[*, M, K]
,如果 full_metrices 设置为 True,那么 Shape 为[*, M, M]
。其中 K 为 M 和 N 的最小值。Tensor S,奇异值向量,Shape 为
[*, K]
。Tensor VH,奇异值分解的 VH 矩阵。如果 full_matrics 设置为 False,则 Shape 为
[*, K, N]
,如果 full_metrices 设置为 True,那么 Shape 为[*, N, N]
。其中 K 为 M 和 N 的最小值。
代码示例¶
>>> import paddle
>>> x = paddle.to_tensor([[1.0, 2.0], [1.0, 3.0], [4.0, 6.0]]).astype('float64')
>>> x = x.reshape([3, 2])
>>> u, s, vh = paddle.linalg.svd(x)
>>> print (u)
Tensor(shape=[3, 2], dtype=float64, place=Place(cpu), stop_gradient=True,
[[-0.27364809, -0.21695147],
[-0.37892198, -0.87112408],
[-0.88404460, 0.44053933]])
>>> print (s)
Tensor(shape=[2], dtype=float64, place=Place(cpu), stop_gradient=True,
[8.14753743, 0.78589688])
>>> print (vh)
Tensor(shape=[2, 2], dtype=float64, place=Place(cpu), stop_gradient=True,
[[-0.51411221, -0.85772294],
[ 0.85772294, -0.51411221]])
>>> # one can verify : U * S * VT == X
>>> # U * UH == I
>>> # V * VH == I