我正在实现Python中稀疏超定系统的求解器(在此讨论:这里),并尝试重建使用标准numpy svd函数(
这两个求解器为何会针对上述矩阵产生不同的SVD输出?我该如何确保相同的输出结果?
因此,以下代码会输出:
请注意,两个解决方案之间存在许多重叠的值。此外,
numpy.linalg.svd
)的nullspace函数在SciPycookbook中的实现,但是我发现它使用scipy.sparse版本的svd(scipy.sparse.linalg.svds
)为我运行的示例输出不同的左奇异向量和右奇异向量,包括以下矩阵:[[1,1,0,0,0],[0,0,1,1,0],[1,1,1,1,1]]
[[1,0,1],[1,1,0],[0,1,1]]
这两个求解器为何会针对上述矩阵产生不同的SVD输出?我该如何确保相同的输出结果?
编辑
以下是一个示例: table 是一个,具体如下:
table.todense() = matrix([[1,1,0,0,0],[0,0,1,1,0],[1,1,1,1,1]],dtype=int64)
因此,以下代码会输出:
numpy.linalg.svd(table.todense()) =
[[ -3.64512933e-01 7.07106781e-01 -6.05912800e-01]
[ -3.64512933e-01 -7.07106781e-01 -6.05912800e-01]
[ -8.56890100e-01 2.32635116e-16 5.15499134e-01]]
-----------------------------------------------------
[ 2.58873755 1.41421356 0.54629468]
-----------------------------------------------------
[[ -4.7181e-01 -4.7181e-01 -4.7181e-01 -4.7181e-01 -3.3101e-01]
[5e-01 5e-01 -5e-01 -5e-01 6.16450329e-17]
[-1.655e-01 -1.655e-01 -1.655e-01 -1.655e-01 9.436e-01]
[5e-01 -5e-01 -5e-01 5e-01 -1.77302319e-16]
[-5e-01 5e-01 -5e-01 5e-01 2.22044605e-16]]
And the following
scipy.sparse.linalg.svds(table,k=2)=
[[ 7.07106781e-01, -3.64512933e-01],
[ -7.07106781e-01, -3.64512933e-01],
[ 2.73756255e-18, -8.56890100e-01]]
-------------------------------------
[ 1.41421356, 2.58873755]
-------------------------------------
[[ 5e-01, 5e-01, -5e-01, -5e-01, 1.93574904e-18],
[ -4.71814e-01, -4.71814e-01, -4.71814e-01, -4.71814e-01, -3.31006e-01]]
请注意,两个解决方案之间存在许多重叠的值。此外,
scipy.sparse.linalg.svds
函数不允许k大于或等于min(table.shape)
,这就是我选择k = 2的原因。
奇异值
(s
)是它们承诺的主要内容。前k个最大的s
值匹配。SVD并不唯一。https://en.wikipedia.org/wiki/Singular-value_decomposition#Calculating_the_SVD - hpauljARPACK
实现,svds
也引用了它。MATLAB具有svd
和svds
两种方法。此外,http://fa.bianp.net/blog/2012/singular-value-decomposition-in-scipy/也是一个不错的参考。 - hpaulj