奇异值分解 (SVD) 输出一维奇异值数组,而不是二维对角矩阵 [Python]

Posted

技术标签:

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

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

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

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

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

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

谢谢!

【问题讨论】:

【参考方案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]])

【讨论】:

以上是关于奇异值分解 (SVD) 输出一维奇异值数组,而不是二维对角矩阵 [Python]的主要内容,如果未能解决你的问题,请参考以下文章

svd 奇异值分解

矩阵奇异值分解SVD

SVD、奇异值分解后矩阵值增加

奇异值分解SVD

奇异值分解的意义

奇异值分解SVD和偏最小二乘奇异值分解PLSSVD