【问题标题】:Singular Value Decomposition (SVD) outputs a 1-D singular value array, instead of 2-D diagonal matrix [Python]奇异值分解 (SVD) 输出一维奇异值数组,而不是二维对角矩阵 [Python]
【发布时间】:2020-07-23 10:32:23
【问题描述】:

我发布了一个类似主题的问题,遇到了另一个更重要的问题。

当我将 SVD 应用于矩阵“A”(下面的代码)时,我得到的输出是预期的二维特征向量矩阵(“U”和“V”)和意外的一维奇异值数组“S” .

U,S,V=np.linalg.svd(A)

对于上下文:它出乎意料的原因是奇异值分解应该导致三个矩阵的乘积。中间矩阵(在本例中为一维数组)应该是对角矩阵,以递减的数量级保存非负奇异值。

为什么 Python 将矩阵“转换”为数组?有办法解决吗?

谢谢!

【问题讨论】:

    标签: python svd diagonal


    【解决方案1】:

    这在docs 中已经说得很清楚了,你会看到:

    s : (…, K) 数组:具有奇异值的向量,在每个向量内按降序排序。第一个 a.ndim - 2 个维度与输入 a 的大小相同。

    所以基本上S 只是您提到的矩阵的对角线,即奇异值。你可以用它构造一个对角矩阵:

    np.diag(S)
    

    【讨论】:

    • 我明白了。我认为可能有一种方法可以内在地改变 svd 函数,但是您和 ev-br 提出的方法似乎更加合理和简单。谢谢!
    【解决方案2】:

    使用 np.diag (https://docs.scipy.org/doc/numpy/reference/generated/numpy.diag.html)

    >>> np.diag([0, 4, 8])
    array([[0, 0, 0],
           [0, 4, 0],
           [0, 0, 8]])
    

    【讨论】:

      猜你喜欢
      • 2016-01-10
      • 2012-12-25
      • 2011-06-30
      • 2010-10-06
      • 2010-10-31
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多