我正在尝试进入单数值分解(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矩阵确实为大小3 = 3。但是,当我执行
U, S, V = np.linalg.svd(A)
矩阵S
包含5个值。另一方面,前3个值与示例中的值匹配,而另一个基本上是0。我可以认为,由于SVD背后的数值和实数的有限表示,我可以认为获得比等级更多的单数值。在计算机上 - 或该线路的东西?
如本页面所述,numpy在内部使用lapack例程_gesdd
进行SVD分解。现在,如果您看到_gesdd
文档,它会提到
要找到一般矩阵A的SVD,请致电Lapack例程?gebrd 或gbbrd将A减少到BiDiaGonal基质B中 (正交)转换:A = QBPH。然后致电?bdsqr,哪种表格 BIDIAGONAL矩阵的SVD:B =U1σV1H。
所以,这里有2个步骤:
- 通过正交转化(住户转换)的双节性化
- 使用隐式零移QR算法获取BidiaGonal矩阵的SVD。
QR算法是一种迭代算法,这意味着您没有得到"确切的"答案,但是每次迭代的近似值越来越好,并且如果值的变化低于阈值,则停止,因此它是"近似"那种感觉。
因此,由于有限的机器表示真实的代表,即使我们具有无限的代表性能力,我们也会获得"近似"结果(如果我们由于迭代时间运行算法),即使我们的数值准确性问题)也会获得"近似"算法。