奇异值分解 (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]的主要内容,如果未能解决你的问题,请参考以下文章