【问题标题】:How can I reconstruct original matrix from SVD components with following shapes?如何从具有以下形状的 SVD 组件重建原始矩阵?
【发布时间】:2021-11-01 12:12:45
【问题描述】:

我正在尝试使用 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 进行分解。

【问题讨论】:

    标签: numpy scipy numpy-ndarray svd


    【解决方案1】:

    来自 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 直到精度误差。

    【讨论】:

    • 谢谢您,先生,这真的很有帮助,并且按预期工作。
    • 我的荣幸! :)
    • 嗨,我的原始矩阵是 30*2*50,我收到错误。我应该更改什么代码?
    • @Agile_Eagle 嘿,使用此代码的最简单方法是应用 mat.transpose((0,2,1)) 以便维度 2 小于或等于维度 1。代码应该运行良好,因此您只需要应用 @987654332 @ 再次适当地重新排列尺寸。
    猜你喜欢
    • 2017-04-10
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多