【问题标题】:Reconstructing a matrix from an SVD in python 3在 python 3 中从 SVD 重建矩阵
【发布时间】:2020-01-26 06:43:36
【问题描述】:

嗨,所以基本上我的问题是我有一个矩阵,我已经 SVD 分解并将它放在变量 u、s 和 v 中。我对 s 矩阵进行了一些更改以使其成为对角线,以及改变了一些数字。现在,我基本上是在尝试将它从 3 个矩阵重建为一个常规矩阵,然后再返回到原始矩阵。有谁知道这样做的任何功能?我似乎在 numpy 中找不到任何这样的例子。

【问题讨论】:

  • 这只是一个矩阵乘法,你可以在维基百科中找到,s 是对角线,你的意思是你做了一些改变来“使它”对角线?
  • 如果您曾经在 python 3 中使用过 numpy,您可能知道当您使用 SVD 函数时,它会将 sigma 矩阵输出为仅包含对角线值的一维数组。所以我不得不把它改成一个对角矩阵,也就是一个二维矩阵,而且我也在做一个低秩近似,所以我做了一个不同的对角矩阵,我将用它来创建第二个矩阵。所以我想知道是否有一个函数可以从 SVD 组件重建矩阵
  • 所以你的修改只是np.diagonal(s)?第二部分只是带有索引的矩阵乘法

标签: python-3.x numpy matrix linear-algebra svd


【解决方案1】:

唯一有点棘手的地方是“扩展”s 如果你安装了scipy,它有scipy.linalg.diagsvd 可以为你做到这一点:

>>> import numpy as np
>>> import scipy.linalg as la
>>> 
>>> rng = np.random.default_rng()
>>> A = rng.uniform(-1,1,(4,3))
>>> u,s,v = np.linalg.svd(A)
>>> 
>>> B = u@la.diagsvd(s,*A.shape)@v
>>> 
>>> np.allclose(A,B)
True

【讨论】:

    【解决方案2】:

    我想通了,只需使用 np.matmul() 函数,然后将 u s 和 v 的 3 个矩阵相乘,就足以将它们恢复为原始矩阵。

    【讨论】:

      猜你喜欢
      • 2019-07-24
      • 2014-02-26
      • 1970-01-01
      • 2023-03-02
      • 2021-07-01
      • 2016-12-17
      • 2017-04-10
      • 2019-07-17
      • 1970-01-01
      相关资源
      最近更新 更多