SVD:恢复的矩阵与原始矩阵不匹配

SVD: The restored matrix doesn't match with the original matrix

我正在尝试在矩阵上使用 sympy 的 SVD:

[3, 2, 2]
[2, 3, -2]

但是,恢复后的矩阵与原始矩阵不匹配。

这是我的代码:

import sympy

A = sympy.Matrix([
  [3, 2, 2],
  [2, 3, -2]
])

A1 = A@A.transpose()
[U, D1] = A1.diagonalize(normalize=True)

A2 = A.transpose()@A
[V, D2] = A2.diagonalize(normalize=True)
V_T = V.transpose()

S = sympy.sqrt(D2).doit()
S = S.row_del(0)

U@S@V_T

输出为:

[2, 3, -2]
[3, 2, 2]

第 1 行和第 2 行与原来的行交换了。
我知道 U 导致了这个结果,即:

Matrix([
[-sqrt(2)/2, sqrt(2)/2],
[ sqrt(2)/2, sqrt(2)/2]])

而不是:

[ sqrt(2)/2, sqrt(2)/2],
[-sqrt(2)/2, sqrt(2)/2]])

...,但我不知道如何解决这个问题。

我给diagonalize()添加了一个参数sort:

[U, D1] = A1.diagonalize(sort=True, normalize=True)

但是,这没什么区别。

你会如何解决这个问题? 提前谢谢你。

我也被我的讲师骗了。我还认为 SVD 非常简单,什么都有。但是特征向量不是唯一的。即使在归一化后,每列都可以乘以 -1 以给出相同的答案。

你的 SVD 不起作用的原因是 U 和 V 是相互关联的,因为它们的列符号需要以某种方式协同工作。进行分离的对角化会忽略这种内在的依赖性,大多数时候你会得到一个错误的答案。

查看此 Maths Exchange 问题和许多其他类似的解释。

下面的内容与数学交流题中的内容相同。

import sympy

A = sympy.Matrix([
  [3, 2, 2],
  [2, 3, -2]
])
# A = U S V'

if A.shape[0] <= A.shape[1]:
    A1 = A * A.T
    U, S = A1.diagonalize(normalize=True)
    V_T = S**-1 * U.T * A
    print(U * S * V_T)
else:
    A2 = A.T * A
    V, S = A2.diagonalize(normalize=True)
    U = A * V * S**-1
    print(U * S * V.T)

我添加了两个单独的案例,如果 A 是“风景”或“肖像”,只是因为数学在每个案例中的表现方式。希望它是正确的。

注意:我强烈建议您使用某种数值计算库,而不是使用符号数学库创建您自己的函数。如果您不使用符号,数值计算库可能会更快。