我正在尝试学习奇异值分解(SVD)。我找到了这个包含示例的YouTube讲座。然而,当我在numpy中尝试这个示例时,我得到了“有点”不同的结果。在这个示例中,输入矩阵是:
A = [ [1,1,1,0,0], [3,3,3,0,0], [4,4,4,0,0], [5,5,5,0,0], [0,2,0,4,4], [0,0,0,5,5], [0,1,0,2,2] ]
A = np.asarray(A)
print(A)
[[1 1 1 0 0]
[3 3 3 0 0]
[4 4 4 0 0]
[5 5 5 0 0]
[0 2 0 4 4]
[0 0 0 5 5]
[0 1 0 2 2]]
这个矩阵的秩是3 (np.linalg.matrix_rank(A)
)。讲座指出奇异值的数量就是矩阵的秩,在这个例子中,Sigma矩阵S的大小确实为3=3。然而,当我执行以下操作时:
U, S, V = np.linalg.svd(A)
矩阵S
包含5个值。另一方面,前3个值与示例中的值匹配,其余2个基本上为0。我是否可以假定由于SVD算法背后的数值算法和计算机上实数的有限表示等原因,可以获得更多的奇异值而不是排名 - 或者类似的东西?
np.allclose(A,np.dot(U * S, V))
仍然返回True
。 - DYZ