我试图用SVD分量重建以下形状矩阵(256 x 256 x 2)
U.shape = (256, 256, 256)
s.shape = (256, 2)
vh.shape = (256, 2, 2)
我已经尝试过numpy和scipy文档中的方法来重建原始矩阵,但多次失败,我想可能是3D矩阵有不同的重建方式。我使用的是numpy.linalg.svddecompostion。
与np.linalg.svd的文档:
"…如果
a
有两个以上的维度,则应用广播规则,如:ref:routines.linalg-broadcasting
所述。这意味着SVD是在"堆叠"中工作;Mode:遍历第一个索引的所有索引a.ndim - 2
维数和对于每个组合SVD应用于最后两个指标。">
这意味着你只需要处理s
矩阵(或张量在一般情况下)来获得正确的张量。更准确地说,您需要做的是适当地填充s
,然后只取前2列(或者通常,vh
的行数应该等于返回的s
的列数)。
这里是一个工作代码与示例为您的情况:
import numpy as np
mat = np.random.randn(256, 256, 2) # Your matrix of dim 256 x 256 x2
u, s, vh = np.linalg.svd(mat) # Get the decomposition
# Pad the singular values' arrays, obtain diagonal matrix and take only first 2 columns:
s_rep = np.apply_along_axis(lambda _s: np.diag(np.pad(_s, (0, u.shape[1]-_s.shape[0])))[:, :_s.shape[0]], 1, s)
mat_reconstructed = u @ s_rep @ vh
mat_reconstructed
等于mat
,直到精度误差