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

时间:2020-04-10 16:17:06

标签: python svd diagonal

我当时正在发布类似主题的问题,并且遇到了另一个更重要的问题。

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

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

对于上下文:出现意外的原因是奇异值分解应导致三个矩阵的乘积。中间矩阵(在这种情况下为一维数组)应为对角矩阵,并按降序保留非负的奇异值。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

这在docs中已经很清楚了,您会看到:

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

所以基本上S只是您提到的矩阵的对角线,即奇异值。您可以使用以下方法从中构造对角矩阵:

np.diag(S)

答案 1 :(得分: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]])