svd_lowrank¶
计算在低秩矩阵或者批次的矩阵上进行奇异值分解(SVD)。
记 \(X\) 为一个矩阵或者批次矩阵,输出结果满足:
         \[X \approx U * diag(S) * V^{T}\]
       
 
       若提供了 \(M\) ,输出结果满足:
         \[X - M \approx U * diag(S) * V^{T}\]
       
 
       参数¶
x (Tensor) - 输入的需要进行奇异值分解的一个或一批方阵,类型为 Tensor。
x的形状应为[*, M, N],其中*为零或更大的批次维度,数据类型支持 float32, float64。
q (int,可选) - 对输入 \(X\) 的秩稍微高估的预估值,默认值为 None,代表预估值取 6。
niter (int) - 需要进行的子空间迭代次数。默认值为 2。
M (Tensor) - 输入矩阵在 axis=-2 维上的均值,形状应为
[*, 1, N],默认为 None。
name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。
返回¶
Tensor U,形状为 N x q 的矩阵。
Tensor S,长度为 q 的向量。
Tensor V,形状为 M x q 的矩阵。
tuple (U, S, V): 对输入 \(X\) 或 \(X-M\) 的奇异值分解的近似最优解。
代码示例¶
>>> import paddle
>>> paddle.seed(2024)
>>> x = paddle.randn((5, 5), dtype='float64')
>>> U, S, V = paddle.linalg.svd_lowrank(x)
>>> print(U)
Tensor(shape=[5, 5], dtype=float64, place=Place(cpu), stop_gradient=True,
[[-0.03586982, -0.17211503,  0.31536566, -0.38225676, -0.85059629],
 [-0.38386839,  0.67754925,  0.23222694,  0.51777188, -0.26749766],
 [-0.85977150, -0.28442378, -0.41412094, -0.08955629, -0.01948348],
 [ 0.18611503,  0.56047358, -0.67717019, -0.39286761, -0.19577062],
 [ 0.27841082, -0.34099254, -0.46535957,  0.65071250, -0.40770727]])
>>> print(S)
Tensor(shape=[5], dtype=float64, place=Place(cpu), stop_gradient=True,
[4.11253399, 3.03227120, 2.45499752, 1.25602436, 0.45825337])
>>> print(V)
Tensor(shape=[5, 5], dtype=float64, place=Place(cpu), stop_gradient=True,
[[ 0.46401347,  0.50977695, -0.08742316, -0.11140428, -0.71046833],
 [-0.48927226, -0.35047624,  0.07918771,  0.45431083, -0.65200463],
 [-0.20494730,  0.67097011, -0.05427719,  0.66510472,  0.24997083],
 [-0.69645001,  0.40237917,  0.09360970, -0.58032322, -0.08666357],
 [ 0.13512270,  0.07199989,  0.98710572,  0.04529277,  0.01134594]])