如何从以下形状的SVD分量重构原始矩阵?



我试图用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,直到精度误差

最新更新