首页 > 解决方案 > 如何从具有以下形状的 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.svd进行分解。

标签: numpyscipynumpy-ndarraysvd

解决方案


np.linalg.svd的文档:

“...如果a有两个以上的维度,则应用广播规则,如 :ref: 中所述routines.linalg-broadcasting。这意味着 SVD 正在“堆叠”模式下工作:它迭代第一个 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精度误差。


推荐阅读